X-Git-Url: http://nitlanguage.org diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 2a2298e..5204376 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -203,6 +203,7 @@ class ANodes[E: ANode] private var parent: ANode private var items = new Array[E] redef fun iterator do return items.iterator + redef fun reverse_iterator do return items.reverse_iterator redef fun length do return items.length redef fun is_empty do return items.is_empty redef fun push(e) @@ -311,6 +312,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,23 +966,8 @@ abstract class TokenLiteral end end -# A literal decimal integer -class TNumber - super TokenLiteral -end - -# A literal hexadecimal integer -class THexNumber - super TokenLiteral -end - -# A literal binary integer -class TBinNumber - super TokenLiteral -end - -# A literal octal integer -class TOctNumber +# A literal integer +class TInteger super TokenLiteral end @@ -1634,6 +1649,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 @@ -2045,15 +2070,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 @@ -2168,7 +2200,7 @@ class AAmpExpr end # A unary operation on a method -class AUnaryopExpr +abstract class AUnaryopExpr super ASendExpr # The operator @@ -2207,7 +2239,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 @@ -2241,7 +2273,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 @@ -2452,40 +2484,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 -end - -# An integer literal in binary format -class ABinIntExpr - super AIntExpr - - # The binary token - var n_bin_number: TBinNumber is writable, noinit -end - -# An integer literal in octal format -class AOctIntExpr - super AIntExpr - # The octal token - var n_oct_number: TOctNumber is writable, noinit + # The integer token + var n_integer: TInteger is writable, noinit end # A float literal @@ -2808,7 +2811,7 @@ class AModuleName # The starting quad (`::`) var n_quad: nullable TQuad = null is writable - # The list of quad-separated project/group identifiers + # The list of quad-separated package/group identifiers var n_path = new ANodes[TId](self) # The final module identifier @@ -2844,7 +2847,7 @@ class AQualified # The starting quad (`::`) var n_quad: nullable TQuad = null is writable - # The list of quad-separated project/group/module identifiers + # The list of quad-separated package/group/module identifiers var n_id = new ANodes[TId](self) # A class identifier