X-Git-Url: http://nitlanguage.org diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 95c83bc..f19547d 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -18,10 +18,11 @@ module parser_nodes import location import ordered_tree +private import console # Root of the AST class-hierarchy abstract class ANode - # Location is set during AST building. Once built, location cannon be null. + # Location is set during AST building. Once built, location can not be null. # However, manual instantiated nodes may need more care. var location: Location is writable, noinit @@ -34,15 +35,28 @@ abstract class ANode sys.stderr.write "{hot_location} {self.class_name}: {message}\n{hot_location.colored_line("0;32")}\n" end + # Is `self` a token or a pure-structural production like `AQId`? + fun is_structural: Bool do return false + # Write the subtree on stdout. - # See `ASTDump` - fun dump_tree + # + # Visit the subtree and display it with additional and useful information. + # + # By default, this displays all kind of nodes and the corresponding lines of codes. + # + # See `ASTDump` for details. + fun dump_tree(display_structural, display_line: nullable Bool) do - var d = new ASTDump + var d = new ASTDump(display_structural or else true, display_line or else true) d.enter_visit(self) d.write_to(sys.stdout) end + # Information to display on a node + # + # Refine this method to add additional information on each node type. + fun dump_info(v: ASTDump): String do return "" + # Parent of the node in the AST var parent: nullable ANode = null @@ -177,8 +191,22 @@ class ASTDump # Is used to handle the initial node parent and workaround possible inconsistent `ANode::parent` private var last_parent: nullable ANode = null + # Display tokens and structural production? + # + # Should tokens (and structural production like AQId) be displayed? + var display_structural: Bool + + # Display lines? + # + # Should each new line be displayed (numbered and in gray)? + var display_line: Bool + + # Current line number (when printing lines) + private var line = 0 + redef fun visit(n) do + if not display_structural and n.is_structural then return var p = last_parent add(p, n) last_parent = n @@ -186,14 +214,35 @@ class ASTDump last_parent = p end - redef fun display(n) + redef fun write_line(o, n, p) do - if n isa Token then - return "{n.class_name} \"{n.text.escape_to_c}\" @{n.location}" - else - return "{n.class_name} @{n.location}" + if display_line then + var ls = n.location.line_start + var file = n.location.file + var line = self.line + if ls > line and file != null then + if line == 0 then line = ls - 1 + while line < ls do + line += 1 + o.write "{line}\t{file.get_line(line)}\n".light_gray + end + self.line = ls + end end + + super + end + + redef fun display(n) + do + return "{n.class_name} {n.dump_info(self)} @{n.location}" end + + # `s` as yellow + fun yellow(s: String): String do return s.yellow + + # `s` as red + fun red(s: String): String do return s.red end # A sequence of nodes @@ -203,6 +252,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 +361,39 @@ 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 + + redef fun is_structural do return true + + redef fun dump_info(v) do return " {text.escape_to_c}" + + # 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 @@ -451,11 +534,16 @@ class TKwinterface super TokenKeyword end -# The keywords `enum` ane `universal` +# The keywords `enum` and `universal` class TKwenum super TokenKeyword end +# The keyword `subset` +class TKwsubset + super TokenKeyword +end + # The keyword `end` class TKwend super TokenKeyword @@ -491,6 +579,11 @@ class TKwdo super TokenKeyword end +# The keyword `catch` +class TKwcatch + super TokenKeyword +end + # The keyword `var` class TKwvar super TokenKeyword @@ -666,6 +759,11 @@ class TKwwith super TokenKeyword end +# The keyword `yield` +class TKwyield + super TokenKeyword +end + # The special keyword `__DEBUG__` class TKwdebug super Token @@ -730,6 +828,51 @@ class TMinuseq super TokenOperator end +# The operator `*=` +class TStareq + super TokenOperator +end + +# The operator `/=` +class TSlasheq + super TokenOperator +end + +# The operator `%=` +class TPercenteq + super TokenOperator +end + +# The operator `**=` +class TStarstareq + super TokenOperator +end + +# The operator `|=` +class TPipeeq + super TokenOperator +end + +# The operator `^=` +class TCareteq + super TokenOperator +end + +# The operator `&=` +class TAmpeq + super TokenOperator +end + +# The operator `<<=` +class TLleq + super TokenOperator +end + +# The operator `>>=` +class TGgeq + super TokenOperator +end + # The symbol `...` class TDotdotdot super Token @@ -770,11 +913,31 @@ class TSlash super TokenOperator end -# The operator `+% +# The operator `%` class TPercent super TokenOperator end +# The operator `|` +class TPipe + super TokenOperator +end + +# The operator `^` +class TCaret + super TokenOperator +end + +# The operator `&` +class TAmp + super TokenOperator +end + +# The operator `~` +class TTilde + super TokenOperator +end + # The operator `==` class TEq super TokenOperator @@ -820,6 +983,11 @@ class TStarship super TokenOperator end +# The operator `?` +class TQuest + super TokenOperator +end + # The operator `!` class TBang super TokenOperator @@ -830,6 +998,11 @@ class TAt super Token end +# The symbol `;` +class TSemi + super Token +end + # A class (or formal type) identifier. They start with an uppercase. class TClassid super Token @@ -866,13 +1039,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 @@ -915,6 +1083,11 @@ class TBadString end end +# A malformed triple quoted string +class TBadTString + super TBadString +end + # A malformed char class TBadChar super Token @@ -929,6 +1102,15 @@ class TExternCodeSegment super Token end +# A malformed extern code block +class TBadExtern + super Token + redef fun to_s + do + do return "malformed extern segment {text}" + end +end + # A end of file class EOF super Token @@ -1031,7 +1213,7 @@ end class APublicVisibility super AVisibility # The `public` keyword, if any - var n_kwpublic: nullable TKwpublic is writable + var n_kwpublic: nullable TKwpublic = null is writable end # An explicit private visibility modifier class APrivateVisibility @@ -1053,8 +1235,9 @@ class AIntrudeVisibility end # A class definition -# While most definition are `AStdClassdef` -# There is tow special case of class definition +# +# While most definitions are `AStdClassdef`s, +# there are 2 special cases of class definitions. abstract class AClassdef super Prod # All the declared properties (including the main method) @@ -1070,11 +1253,17 @@ class AStdClassdef var n_classkind: AClasskind is writable, noinit # The name of the class - var n_id: nullable TClassid = null is writable + var n_qid: nullable AQclassid = 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 @@ -1085,7 +1274,7 @@ class AStdClassdef return [for d in n_propdefs do if d isa ASuperPropdef then d] end - redef fun hot_location do return n_id.location + redef fun hot_location do return n_qid.location end # The implicit class definition of the implicit main method @@ -1149,6 +1338,18 @@ class AExternClasskind var n_kwclass: nullable TKwclass = null is writable end +class ASubsetClasskind + super AClasskind + + # The `subset` keyword. + var n_kwsubset: TKwsubset is writable, noinit + + redef fun visit_all(v) do + # TODO: Remove this redefinition once generated from the grammar. + v.enter_visit(n_kwsubset) + end +end + # The definition of a formal generic parameter type. eg `X: Y` class AFormaldef super Prod @@ -1170,21 +1371,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 @@ -1201,6 +1411,9 @@ class AMethPropdef # The `init` keyword, if any var n_kwinit: nullable TKwinit = null is writable + # The `isa` keyword, if any + var n_kwisa: nullable TKwisa = null is writable + # The `new` keyword, if any var n_kwnew: nullable TKwnew = null is writable @@ -1210,9 +1423,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 @@ -1375,7 +1594,7 @@ class ATypePropdef var n_kwtype: TKwtype is writable, noinit # The name of the virtual type - var n_id: TClassid is writable, noinit + var n_qid: AQclassid is writable, noinit # The bound of the virtual type var n_type: AType is writable, noinit @@ -1395,116 +1614,106 @@ class AIdMethid var n_id: TId is writable, noinit end -# A method name `+` -class APlusMethid +# A method name for an operator +class AOperatorMethid super AMethid - # The `+` symbol - var n_plus: TPlus is writable, noinit + # The associated operator symbol + var n_op: Token is writable, noinit +end +# A method name `+` +class APlusMethid + super AOperatorMethid end # A method name `-` class AMinusMethid - super AMethid - - # The `-` symbol - var n_minus: TMinus is writable, noinit + super AOperatorMethid end # A method name `*` class AStarMethid - super AMethid - - # The `*` symbol - var n_star: TStar is writable, noinit + super AOperatorMethid end # A method name `**` class AStarstarMethid - super AMethid - - # The `**` symbol - var n_starstar: TStarstar is writable, noinit + super AOperatorMethid end # A method name `/` class ASlashMethid - super AMethid - - # The `/` symbol - var n_slash: TSlash is writable, noinit + super AOperatorMethid end # A method name `%` class APercentMethid - super AMethid + super AOperatorMethid +end + +# A method name `|` +class APipeMethid + super AOperatorMethid +end + +# A method name `^` +class ACaretMethid + super AOperatorMethid +end + +# A method name `&` +class AAmpMethid + super AOperatorMethid +end - # The `%` symbol - var n_percent: TPercent is writable, noinit +# A method name `~` +class ATildeMethid + super AOperatorMethid end # A method name `==` class AEqMethid - super AMethid - - # The `==` symbol - var n_eq: TEq is writable, noinit + super AOperatorMethid end # A method name `!=` class ANeMethid - super AMethid - - # The `!=` symbol - var n_ne: TNe is writable, noinit + super AOperatorMethid end # A method name `<=` class ALeMethid - super AMethid - - # The `<=` symbol - var n_le: TLe is writable, noinit + super AOperatorMethid end # A method name `>=` class AGeMethid - super AMethid - - # The `>=` symbol - var n_ge: TGe is writable, noinit + super AOperatorMethid end # A method name `<` class ALtMethid - super AMethid - - # The `<` symbol - var n_lt: TLt is writable, noinit + super AOperatorMethid end # A method name `>` class AGtMethid - super AMethid - - # The `>` symbol - var n_gt: TGt is writable, noinit + super AOperatorMethid end # A method name `<<` class ALlMethid - super AMethid - - # The `<<` symbol - var n_ll: TLl is writable, noinit + super AOperatorMethid end # A method name `>>` class AGgMethid - super AMethid + super AOperatorMethid +end - # The `>>` symbol - var n_gg: TGg is writable, noinit +# A method name `<=>` +class AStarshipMethid + super AOperatorMethid end # A method name `[]` @@ -1518,14 +1727,6 @@ class ABraMethid var n_cbra: TCbra is writable, noinit end -# A method name `<=>` -class AStarshipMethid - super AMethid - - # The `<=>` symbol - var n_starship: TStarship is writable, noinit -end - # A setter method name with a simple identifier (with a `=`) class AAssignMethid super AMethid @@ -1551,6 +1752,30 @@ 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 + + redef fun is_structural do return true +end + +# A potentially qualified class identifier `foo::bar::Baz` +class AQclassid + super Prod + # The qualifier, if any + var n_qualified: nullable AQualified = null is writable + + # The final identifier + var n_id: TClassid is writable, noinit + + redef fun is_structural do return true +end + # A signature in a method definition. eg `(x,y:X,z:Z):T` class ASignature super Prod @@ -1589,10 +1814,16 @@ class AType var n_kwnullable: nullable TKwnullable = null is writable # The name of the class or of the formal type - var n_id: TClassid is writable, noinit + var n_qid: AQclassid 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` @@ -1647,10 +1878,18 @@ end # A `return` statement. eg `return x` class AReturnExpr - super AExpr + super AEscapeExpr # The `return` keyword var n_kwreturn: nullable TKwreturn = null is writable +end + +# A `yield` statement. eg `yield x` +class AYieldExpr + super AExpr + + # The `yield` keyword + var n_kwyield: nullable TKwyield = null is writable # The return value, if any var n_expr: nullable AExpr = null is writable @@ -1707,6 +1946,12 @@ class ADoExpr # The list of statements of the `do`. var n_block: nullable AExpr = null is writable + + # The `catch` keyword + var n_kwcatch: nullable TKwcatch = null is writable + + # The do catch block + var n_catch: nullable AExpr = null is writable end # A `if` statement @@ -1719,9 +1964,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 @@ -1787,11 +2038,8 @@ class AForExpr # The `for` keyword var n_kwfor: TKwfor is writable, noinit - # The list of name of the automatic variables - var n_ids = new ANodes[TId](self) - - # The expression used as the collection to iterate on - var n_expr: AExpr is writable, noinit + # The list of groups to iterate + var n_groups = new ANodes[AForGroup](self) # The `do` keyword var n_kwdo: TKwdo is writable, noinit @@ -1800,6 +2048,23 @@ class AForExpr var n_block: nullable AExpr = null is writable end +# A collection iterated by a for, its automatic variables and its implicit iterator. +# +# Standard `for` iterate on a single collection. +# Multiple `for` can iterate on more than one collection at once. +class AForGroup + super Prod + + # 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 +end + # A `with` statement class AWithExpr super AExpr @@ -1831,6 +2096,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 @@ -1879,9 +2147,16 @@ end # A binary operation on a method abstract class ABinopExpr super ASendExpr + + # The operator + var n_op: Token is writable, noinit + # The second operand of the operation # Note: the receiver (`n_expr`) is the first operand var n_expr2: AExpr is writable, noinit + + # The name of the operator (eg '+') + fun operator: String is abstract end # Something that is boolean expression @@ -1896,6 +2171,9 @@ abstract class ABinBoolExpr # The first boolean operand var n_expr: AExpr is writable, noinit + # The operator + var n_op: Token is writable, noinit + # The second boolean operand var n_expr2: AExpr is writable, noinit end @@ -1913,6 +2191,9 @@ end # A `or else` expression class AOrElseExpr super ABinBoolExpr + + # The `else` keyword + var n_kwelse: TKwelse is writable, noinit end # A `implies` expression @@ -1931,44 +2212,59 @@ 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 # A `<` expression class ALtExpr super ABinopExpr + redef fun operator do return "<" end # A `<=` expression class ALeExpr super ABinopExpr + redef fun operator do return "<=" end # A `<<` expression class ALlExpr super ABinopExpr + redef fun operator do return "<<" end # A `>` expression class AGtExpr super ABinopExpr + redef fun operator do return ">" end # A `>=` expression class AGeExpr super ABinopExpr + redef fun operator do return ">=" end # A `>>` expression class AGgExpr super ABinopExpr + redef fun operator do return ">>" end # A type-ckeck expression. eg `x isa T` @@ -1978,6 +2274,9 @@ class AIsaExpr # The expression to check var n_expr: AExpr is writable, noinit + # The `isa` keyword + var n_kwisa: TKwisa is writable, noinit + # The destination type to check to var n_type: AType is writable, noinit end @@ -1985,44 +2284,90 @@ end # A `+` expression class APlusExpr super ABinopExpr + redef fun operator do return "+" end # A `-` expression class AMinusExpr super ABinopExpr + redef fun operator do return "-" end # A `<=>` expression class AStarshipExpr super ABinopExpr + redef fun operator do return "<=>" end # A `*` expression class AStarExpr super ABinopExpr + redef fun operator do return "*" end # A `**` expression class AStarstarExpr super ABinopExpr + redef fun operator do return "**" end # A `/` expression class ASlashExpr super ABinopExpr + redef fun operator do return "/" end # A `%` expression class APercentExpr super ABinopExpr + redef fun operator do return "%" +end + +# A `|` expression +class APipeExpr + super ABinopExpr + redef fun operator do return "|" +end + +# A `^` expression +class ACaretExpr + super ABinopExpr + redef fun operator do return "^" +end + +# A `&` expression +class AAmpExpr + super ABinopExpr + redef fun operator do return "&" +end + +# A unary operation on a method +abstract class AUnaryopExpr + super ASendExpr + + # The operator + var n_op: Token is writable, noinit + + # The name of the operator (eg '+') + fun operator: String is abstract end # A unary minus expression. eg `-x` class AUminusExpr - super ASendExpr + super AUnaryopExpr + redef fun operator do return "-" +end + +# A unary plus expression. eg `+x` +class AUplusExpr + super AUnaryopExpr + redef fun operator do return "+" +end - # The `-` symbol - var n_minus: TMinus is writable, noinit +# A unary `~` expression +class AUtildeExpr + super AUnaryopExpr + redef fun operator do return "~" end # An explicit instantiation. eg `new T` @@ -2036,7 +2381,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 @@ -2070,7 +2415,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 @@ -2111,6 +2456,27 @@ class ACallReassignExpr super ASendReassignFormExpr end +# A reference to a method with a captured receiver. eg. `&x.foo` or just `&foo` is self is captured. +# +# Currently, the syntax is analogous to a simple call (`recv.foo`) with a prefix `&`. +# On chains, only the last call is captured (`.` has a higher precedence than `&`). +# +# The syntax is analogous to a call (except the &), there is always a receiver (including the implicit self or sys) and arguments are accepted by the parser. +# +# TODO There is no clear syntax proposal +# +# * to avoid the capture of a receiver since a receiver is statically expected to resolve the method name +# * for special method names (setters, brackets and operators) +# +# Note: The class specializes `ASendExpr` (trough `ACallFormExpr`) so some behavior of a genuine send expression must be redefined. +class ACallrefExpr + super ACallFormExpr + + # The `&` operator + var n_amp: TAmp is writable, noinit +end + + # A call to `super`. OR a call of a super-constructor class ASuperExpr super AExpr @@ -2197,7 +2563,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 @@ -2278,24 +2647,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 @@ -2351,6 +2707,14 @@ class ASuperstringExpr var n_exprs = new ANodes[AExpr](self) end +class ALambdaExpr + super AExpr + var n_kwmeth: TKwmeth is writable, noinit + var n_signature: ASignature is writable, noinit + var n_kwdo: TKwdo is writable, noinit + var n_expr: AExpr is writable, noinit +end + # A simple parenthesis. eg `(x)` class AParExpr super AExpr @@ -2420,6 +2784,31 @@ class AVarargExpr var n_dotdotdot: TDotdotdot is writable, noinit end +# A receiver with a `?` suffix used in safe call operator. +class ASafeExpr + super AExpr + + # The expression made safe + var n_expr: AExpr is writable, noinit + + # The `?` symbol + var n_quest: TQuest is writable, noinit +end + +# An named notation used to pass an expression by name in a parameter +class ANamedargExpr + super AExpr + + # The name of the argument + var n_id: TId is writable, noinit + + # The `=` synbol + var n_assign: TAssign is writable, noinit + + # The passed expression + var n_expr: AExpr is writable, noinit +end + # A list of expression separated with commas (arguments for instance) class AManyExpr super AExpr @@ -2512,22 +2901,89 @@ end # A complex assignment operator. (`+=` and `-=`) abstract class AAssignOp super Prod + + # The combined assignment operator + var n_op: Token is writable, noinit + + # The name of the operator without the `=` (eg '+') + fun operator: String is abstract end -# The `+=` assignment operation +# A `+=` assignment operation class APlusAssignOp super AAssignOp - # The `+=` operator - var n_pluseq: TPluseq is writable, noinit + redef fun operator do return "+" end -# The `-=` assignment operator +# A `-=` assignment operation class AMinusAssignOp super AAssignOp - # The `-=` operator - var n_minuseq: TMinuseq is writable, noinit + redef fun operator do return "-" +end + +# A `*=` assignment operation +class AStarAssignOp + super AAssignOp + + redef fun operator do return "*" +end + +# A `/=` assignment operation +class ASlashAssignOp + super AAssignOp + + redef fun operator do return "/" +end + +# A `%=` assignment operation +class APercentAssignOp + super AAssignOp + + redef fun operator do return "%" +end + +# A `**=` assignment operation +class AStarstarAssignOp + super AAssignOp + + redef fun operator do return "**" +end + +# A `|=` assignment operation +class APipeAssignOp + super AAssignOp + + redef fun operator do return "|" +end + +# A `^=` assignment operation +class ACaretAssignOp + super AAssignOp + + redef fun operator do return "^" +end + +# A `&=` assignment operation +class AAmpAssignOp + super AAssignOp + + redef fun operator do return "&" +end + +# A `<<=` assignment operation +class ALlAssignOp + super AAssignOp + + redef fun operator do return "<<" +end + +# A `>>=` assignment operation +class AGgAssignOp + super AAssignOp + + redef fun operator do return ">>" end # A possibly fully-qualified module identifier @@ -2537,7 +2993,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 @@ -2573,7 +3029,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 @@ -2599,6 +3055,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 @@ -2610,6 +3069,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 @@ -2640,7 +3102,8 @@ abstract class AAtid super Prod # The identifier of the annotation. - # Can be a TId of a keyword + # + # Can be a TId or a keyword. var n_id: Token is writable, noinit end