X-Git-Url: http://nitlanguage.org diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 8c7b941..9550339 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -311,6 +311,35 @@ abstract class Token # May have disappeared in the AST var next_token: nullable Token = null + # Is `self` a token discarded from the AST? + # + # Loose tokens are not present in the AST. + # It means they were identified by the lexer but were discarded by the parser. + # It also means that they are not visited or manipulated by AST-related functions. + # + # Each loose token is attached to the non-loose token that precedes or follows it. + # The rules are the following: + # + # * tokens that follow a non-loose token on a same line are attached to it. + # See `next_looses`. + # * other tokens, thus that precede a non-loose token on the same line or the next one, + # are attached to this one. See `prev_looses`. + # + # Loose tokens are mostly end of lines (`TEol`) and comments (`TComment`). + # Whitespace are ignored by the lexer, so they are not even considered as loose tokens. + # See `blank_before` to get the whitespace that separate tokens. + var is_loose = false + + # Loose tokens that precede `self`. + # + # These tokens start the line or belong to a line with only loose tokens. + var prev_looses = new Array[Token] is lazy + + # Loose tokens that follow `self` + # + # These tokens are on the same line than `self`. + var next_looses = new Array[Token] is lazy + # The verbatim blank text between `prev_token` and `self` fun blank_before: String do @@ -936,13 +965,8 @@ abstract class TokenLiteral end end -# A literal decimal integer -class TNumber - super TokenLiteral -end - -# A literal hexadecimal integer -class THexNumber +# A literal integer +class TInteger super TokenLiteral end @@ -1142,9 +1166,15 @@ class AStdClassdef # The name of the class var n_id: nullable TClassid = null is writable + # The `[` symbol + var n_obra: nullable TObra = null is writable + # The list of formal parameter types var n_formaldefs = new ANodes[AFormaldef](self) + # The `]` symbol + var n_cbra: nullable TCbra = null is writable + # The extern block code var n_extern_code_block: nullable AExternCodeBlock = null is writable @@ -1240,21 +1270,30 @@ end class AAttrPropdef super APropdef - # The identifier for a old-style attribute (null if new-style) + # The `var` keyword var n_kwvar: TKwvar is writable, noinit - # The identifier for a new-style attribute (null if old-style) + # The identifier for a new-style attribute var n_id2: TId is writable, noinit # The declared type of the attribute var n_type: nullable AType = null is writable + # The `=` symbol + var n_assign: nullable TAssign = null is writable + # The initial value, if any (set with `=`) var n_expr: nullable AExpr = null is writable + # The `do` keyword + var n_kwdo: nullable TKwdo = null is writable + # The initial value, if any (set with `do return`) var n_block: nullable AExpr = null is writable + # The `end` keyword + var n_kwend: nullable TKwend = null is writable + redef fun hot_location do return n_id2.location @@ -1280,9 +1319,15 @@ class AMethPropdef # The signature of the method, if any var n_signature: nullable ASignature = null is writable + # The `do` keyword + var n_kwdo: nullable TKwdo = null is writable + # The body (in Nit) of the method, if any var n_block: nullable AExpr = null is writable + # The `end` keyword + var n_kwend: nullable TKwend = null is writable + # The list of declared callbacks (for extern methods) var n_extern_calls: nullable AExternCalls = null is writable @@ -1603,6 +1648,16 @@ class ABraassignMethid var n_assign: TAssign is writable, noinit end +# A potentially qualified simple identifier `foo::bar::baz` +class AQid + super Prod + # The qualifier, if any + var n_qualified: nullable AQualified = null is writable + + # The final identifier + var n_id: TId is writable, noinit +end + # A signature in a method definition. eg `(x,y:X,z:Z):T` class ASignature super Prod @@ -1643,8 +1698,14 @@ class AType # The name of the class or of the formal type var n_id: TClassid is writable, noinit + # The opening bracket + var n_obra: nullable TObra = null is writable + # Type arguments for a generic type var n_types = new ANodes[AType](self) + + # The closing bracket + var n_cbra: nullable TCbra = null is writable end # A label at the end of a block or in a break/continue statement. eg `label x` @@ -1771,9 +1832,15 @@ class AIfExpr # The expression used as the condition of the `if` var n_expr: AExpr is writable, noinit + # The `then` keyword + var n_kwthen: TKwthen is writable, noinit + # The body of the `then` part var n_then: nullable AExpr = null is writable + # The `else` keyword + var n_kwelse: nullable TKwelse = null is writable + # The body of the `else` part var n_else: nullable AExpr = null is writable end @@ -1842,6 +1909,9 @@ class AForExpr # The list of name of the automatic variables var n_ids = new ANodes[TId](self) + # The `in` keyword + var n_kwin: TKwin is writable, noinit + # The expression used as the collection to iterate on var n_expr: AExpr is writable, noinit @@ -1883,6 +1953,9 @@ class AAssertExpr # The expression used as the condition of the `assert` var n_expr: AExpr is writable, noinit + # The `else` keyword + var n_kwelse: nullable TKwelse = null is writable + # The body to execute when the assert fails var n_else: nullable AExpr = null is writable end @@ -1996,15 +2069,22 @@ class ANotExpr var n_expr: AExpr is writable, noinit end +# A `==` or a `!=` expression +# +# Both have a similar effect on adaptive typing, so this class factorizes the common behavior. +class AEqFormExpr + super ABinopExpr +end + # A `==` expression class AEqExpr - super ABinopExpr + super AEqFormExpr redef fun operator do return "==" end # A `!=` expression class ANeExpr - super ABinopExpr + super AEqFormExpr redef fun operator do return "!=" end @@ -2119,7 +2199,7 @@ class AAmpExpr end # A unary operation on a method -class AUnaryopExpr +abstract class AUnaryopExpr super ASendExpr # The operator @@ -2158,7 +2238,7 @@ class ANewExpr var n_type: AType is writable, noinit # The name of the named-constructor, if any - var n_id: nullable TId = null is writable + var n_qid: nullable AQid = null is writable # The arguments of the `new` var n_args: AExprs is writable, noinit @@ -2192,7 +2272,7 @@ abstract class ACallFormExpr super ASendExpr # The name of the method - var n_id: TId is writable, noinit + var n_qid: AQid is writable, noinit # The arguments of the call var n_args: AExprs is writable, noinit @@ -2319,7 +2399,10 @@ abstract class ARangeExpr # The left (lower) element of the range var n_expr: AExpr is writable, noinit - # The right (uppr) element of the range + # The `..` + var n_dotdot: TDotdot is writable, noinit + + # The right (upper) element of the range var n_expr2: AExpr is writable, noinit end @@ -2400,24 +2483,11 @@ class ANullExpr end # An integer literal -class AIntExpr +class AIntegerExpr super AExpr -end -# An integer literal in decimal format -class ADecIntExpr - super AIntExpr - - # The decimal token - var n_number: TNumber is writable, noinit -end - -# An integer literal in hexadecimal format -class AHexIntExpr - super AIntExpr - - # The hexadecimal token - var n_hex_number: THexNumber is writable, noinit + # The integer token + var n_integer: TInteger is writable, noinit end # A float literal @@ -2802,6 +2872,9 @@ end class AAnnotations super Prod + # The `is` keyword, for *is* annotations + var n_kwis: nullable TKwis = null is writable + # The `@` symbol, for *at* annotations var n_at: nullable TAt = null is writable @@ -2813,6 +2886,9 @@ class AAnnotations # The closing parenthesis in *at* annotations var n_cpar: nullable TCpar = null is writable + + # The `end` keyword, for *is* annotations + var n_kwend: nullable TKwend = null is writable end # A single annotation