X-Git-Url: http://nitlanguage.org diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 1c0eb21..9131c3e 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 @@ -352,11 +381,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 @@ -655,6 +690,11 @@ class TKwlabel super TokenKeyword end +# The keyword `with` +class TKwwith + super TokenKeyword +end + # The special keyword `__DEBUG__` class TKwdebug super Token @@ -719,6 +759,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 @@ -759,11 +844,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 @@ -819,6 +924,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 @@ -865,6 +975,36 @@ class THexNumber super TokenLiteral end +# A literal binary integer +class TBinNumber + super TokenLiteral +end + +# A literal octal integer +class TOctNumber + super TokenLiteral +end + +# A literal decimal byte +class TBytenum + super TokenLiteral +end + +# A literal hexadecimal byte +class THexBytenum + super TokenLiteral +end + +# A literal binary byte +class TBinBytenum + super TokenLiteral +end + +# A literal octal byte +class TOctBytenum + super TokenLiteral +end + # A literal floating point number class TFloat super TokenLiteral @@ -1061,18 +1201,25 @@ 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 - # The list of super-classes - var n_superclasses = new ANodes[ASuperclass](self) - # The `end` keyword var n_kwend: TKwend is writable, noinit + fun n_superclasses: Array[ASuperPropdef] do + return [for d in n_propdefs do if d isa ASuperPropdef then d] + end + redef fun hot_location do return n_id.location end @@ -1148,17 +1295,6 @@ class AFormaldef var n_type: nullable AType = null is writable end -# A super-class. eg `super X` -class ASuperclass - super Prod - - # The super keyword - var n_kwsuper: TKwsuper is writable, noinit - - # The super-class (indicated as a type) - var n_type: AType is writable, noinit -end - # The definition of a property abstract class APropdef super ADefinition @@ -1169,21 +1305,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 @@ -1209,9 +1354,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 @@ -1237,6 +1388,23 @@ class AMainMethPropdef super AMethPropdef end +class AAnnotPropdef + super APropdef + super AAnnotation +end + +# A super-class. eg `super X` +class ASuperPropdef + super APropdef + + # The super keyword + var n_kwsuper: TKwsuper is writable, noinit + + # The super-class (indicated as a type) + var n_type: AType is writable, noinit +end + + # Declaration of callbacks for extern methods class AExternCalls super Prod @@ -1377,116 +1545,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 - # The `%` symbol - var n_percent: TPercent is writable, noinit +# A method name `&` +class AAmpMethid + super AOperatorMethid +end + +# 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 `[]` @@ -1500,14 +1658,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 @@ -1573,8 +1723,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` @@ -1585,7 +1741,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 @@ -1612,7 +1768,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 @@ -1701,9 +1857,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 @@ -1772,6 +1934,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 @@ -1782,6 +1947,24 @@ class AForExpr var n_block: nullable AExpr = null is writable 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 + + # The body of the loop + var n_block: nullable AExpr = null is writable +end + # An `assert` statement class AAssertExpr super AExpr @@ -1795,6 +1978,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 @@ -1843,9 +2029,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 @@ -1860,6 +2053,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 @@ -1877,6 +2073,9 @@ end # A `or else` expression class AOrElseExpr super ABinBoolExpr + + # The `else` keyword + var n_kwelse: TKwelse is writable, noinit end # A `implies` expression @@ -1898,41 +2097,49 @@ end # A `==` expression class AEqExpr super ABinopExpr + redef fun operator do return "==" end # A `!=` expression class ANeExpr super ABinopExpr + 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` @@ -1942,6 +2149,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 @@ -1949,44 +2159,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 +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` @@ -2161,7 +2417,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 @@ -2209,7 +2468,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 @@ -2262,6 +2521,59 @@ class AHexIntExpr 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 +end + +# An byte literal +class AByteExpr + super AExpr +end + +# An byte literal in decimal format +class ADecByteExpr + super AByteExpr + + # The decimal token + var n_bytenum: TBytenum is writable, noinit +end + +# An byte literal in hexadecimal format +class AHexByteExpr + super AByteExpr + + # The hexadecimal token + var n_hex_bytenum: THexBytenum is writable, noinit +end + +# An byte literal in binary format +class ABinByteExpr + super AByteExpr + + # The binary token + var n_bin_bytenum: TBinBytenum is writable, noinit +end + +# An byte literal in octal format +class AOctByteExpr + super AByteExpr + + # The octal token + var n_oct_bytenum: TOctBytenum is writable, noinit +end + # A float literal class AFloatExpr super AExpr @@ -2384,6 +2696,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 @@ -2476,22 +2802,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 @@ -2563,6 +2956,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 @@ -2574,6 +2970,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