grammar: add `for_group` in `for` for multi-iterators
[nit.git] / src / parser / parser_nodes.nit
index 93a26e2..df01109 100644 (file)
@@ -17,6 +17,7 @@
 module parser_nodes
 
 import location
+import ordered_tree
 
 # Root of the AST class-hierarchy
 abstract class ANode
@@ -33,6 +34,15 @@ abstract class ANode
                sys.stderr.write "{hot_location} {self.class_name}: {message}\n{hot_location.colored_line("0;32")}\n"
        end
 
+       # Write the subtree on stdout.
+       # See `ASTDump`
+       fun dump_tree
+       do
+               var d = new ASTDump
+               d.enter_visit(self)
+               d.write_to(sys.stdout)
+       end
+
        # Parent of the node in the AST
        var parent: nullable ANode = null
 
@@ -158,6 +168,33 @@ private class CollectAnnotationsByNameVisitor
        end
 end
 
+# A helper class to handle (print) Nit AST as an OrderedTree
+class ASTDump
+       super Visitor
+       super OrderedTree[ANode]
+
+       # Reference to the last parent in the Ordered Tree
+       # Is used to handle the initial node parent and workaround possible inconsistent `ANode::parent`
+       private var last_parent: nullable ANode = null
+
+       redef fun visit(n)
+       do
+               var p = last_parent
+               add(p, n)
+               last_parent = n
+               n.visit_all(self)
+               last_parent = p
+       end
+
+       redef fun display(n)
+       do
+               if n isa Token then
+                       return "{n.class_name} \"{n.text.escape_to_c}\" @{n.location}"
+               else
+                       return "{n.class_name} @{n.location}"
+               end
+       end
+end
 
 # A sequence of nodes
 # It is a specific class (instead of using a Array) to track the parent/child relation when nodes are added or removed
@@ -166,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)
@@ -274,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
@@ -315,11 +382,17 @@ abstract class Prod
        do
                var res = new Array[AAnnotation]
                var nas = n_annotations
-               if nas == null then return res
-               for na in nas.n_items do
+               if nas != null then for na in nas.n_items do
                        if na.name != name then continue
                        res.add(na)
                end
+               if self isa AClassdef then for na in n_propdefs do
+                       if na isa AAnnotPropdef then
+                               if na.name != name then continue
+                               res.add na
+                       end
+               end
+
                return res
        end
 
@@ -618,6 +691,11 @@ class TKwlabel
        super TokenKeyword
 end
 
+# The keyword `with`
+class TKwwith
+       super TokenKeyword
+end
+
 # The special keyword `__DEBUG__`
 class TKwdebug
        super Token
@@ -682,6 +760,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
@@ -722,11 +845,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
@@ -782,6 +925,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
@@ -818,13 +966,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
 
@@ -1024,9 +1167,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
 
@@ -1122,21 +1271,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
@@ -1162,9 +1320,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
 
@@ -1190,6 +1354,11 @@ class AMainMethPropdef
        super AMethPropdef
 end
 
+class AAnnotPropdef
+       super APropdef
+       super AAnnotation
+end
+
 # A super-class. eg `super X`
 class ASuperPropdef
        super APropdef
@@ -1342,116 +1511,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 `[]`
@@ -1465,14 +1624,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
@@ -1498,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
@@ -1538,8 +1699,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`
@@ -1550,7 +1717,7 @@ class ALabel
        var n_kwlabel: TKwlabel is writable, noinit
 
        # The name of the label, if any
-       var n_id: nullable TId is writable
+       var n_id: nullable TId is writable, noinit
 end
 
 # Expression and statements
@@ -1577,7 +1744,7 @@ class AVardeclExpr
        super AExpr
 
        # The `var` keyword
-       var n_kwvar: TKwvar is writable, noinit
+       var n_kwvar: nullable TKwvar = null is writable
 
        # The name of the local variable
        var n_id: TId is writable, noinit
@@ -1666,9 +1833,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
@@ -1734,11 +1907,43 @@ class AForExpr
        # The `for` keyword
        var n_kwfor: TKwfor 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
+
+       # The body of the loop
+       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
+       super ALabelable
+
+       # The `with` keyword
+       var n_kwwith: TKwwith is writable, noinit
+
+       # The expression used to get the value to control
+       var n_expr: AExpr is writable, noinit
 
        # The `do` keyword
        var n_kwdo: TKwdo is writable, noinit
@@ -1760,6 +1965,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
@@ -1808,9 +2016,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
@@ -1825,6 +2040,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
@@ -1842,6 +2060,9 @@ end
 # A `or else` expression
 class AOrElseExpr
        super ABinBoolExpr
+
+       # The `else` keyword
+       var n_kwelse: TKwelse is writable, noinit
 end
 
 # A `implies` expression
@@ -1860,44 +2081,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`
@@ -1907,6 +2143,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
@@ -1914,44 +2153,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
 
-       # The `-` symbol
-       var n_minus: TMinus is writable, noinit
+# A unary plus expression. eg `+x`
+class AUplusExpr
+       super AUnaryopExpr
+       redef fun operator do return "+"
+end
+
+# A unary `~` expression
+class AUtildeExpr
+       super AUnaryopExpr
+       redef fun operator do return "~"
 end
 
 # An explicit instantiation. eg `new T`
@@ -1965,7 +2250,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
@@ -1999,7 +2284,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
@@ -2126,7 +2411,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
 
@@ -2174,7 +2462,7 @@ class ASelfExpr
        super AExpr
 
        # The `self` keyword
-       var n_kwself: nullable TKwself is writable
+       var n_kwself: nullable TKwself = null is writable
 end
 
 # When there is no explicit receiver, `self` is implicit
@@ -2207,24 +2495,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
@@ -2349,6 +2624,20 @@ class AVarargExpr
        var n_dotdotdot: TDotdotdot 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
@@ -2441,22 +2730,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
@@ -2466,7 +2822,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
@@ -2502,7 +2858,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
@@ -2528,6 +2884,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
 
@@ -2539,6 +2898,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