X-Git-Url: http://nitlanguage.org diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 3db6ebd..b883ad4 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -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 @@ -117,6 +127,73 @@ abstract class ANode # Visit all nodes in order. # Thus, call `v.enter_visit(e)` for each child `e` fun visit_all(v: Visitor) is abstract + + # Do a deep search and return an array of tokens that match a given text + fun collect_tokens_by_text(text: String): Array[Token] + do + var v = new CollectTokensByTextVisitor(text) + v.enter_visit(self) + return v.result + end + + # Do a deep search and return an array of node that are annotated + # The attached node can be retrieved by two invocations of parent + fun collect_annotations_by_name(name: String): Array[AAnnotation] + do + var v = new CollectAnnotationsByNameVisitor(name) + v.enter_visit(self) + return v.result + end +end + +private class CollectTokensByTextVisitor + super Visitor + var text: String + var result = new Array[Token] + redef fun visit(node) + do + node.visit_all(self) + if node isa Token and node.text == text then result.add(node) + end +end + +private class CollectAnnotationsByNameVisitor + super Visitor + var name: String + var result = new Array[AAnnotation] + redef fun visit(node) + do + node.visit_all(self) + if node isa AAnnotation and node.n_atid.n_id.text == name then result.add(node) + 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 @@ -269,6 +346,26 @@ abstract class Prod # All the annotations attached directly to the node var n_annotations: nullable AAnnotations = null is writable + # Return all its annotations of a given name in the order of their declaration + # Retun an empty array if no such an annotation. + fun get_annotations(name: String): Array[AAnnotation] + do + var res = new Array[AAnnotation] + var nas = n_annotations + 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 + redef fun replace_with(n: ANode) do super @@ -564,6 +661,11 @@ class TKwlabel super TokenKeyword end +# The keyword `with` +class TKwwith + super TokenKeyword +end + # The special keyword `__DEBUG__` class TKwdebug super Token @@ -628,6 +730,36 @@ 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 TLleq + super TokenOperator +end + +# The operator `>>=` +class TGgeq + super TokenOperator +end + # The symbol `...` class TDotdotdot super Token @@ -976,12 +1108,13 @@ class AStdClassdef # 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 @@ -1057,17 +1190,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 @@ -1146,6 +1268,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 @@ -1286,116 +1425,87 @@ 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 - # The `%` symbol - var n_percent: TPercent is writable, noinit 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 `[]` @@ -1409,14 +1519,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 @@ -1494,7 +1596,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 @@ -1521,7 +1623,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 @@ -1691,6 +1793,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 @@ -1752,9 +1872,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 @@ -1769,6 +1896,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 @@ -1786,6 +1916,9 @@ end # A `or else` expression class AOrElseExpr super ABinBoolExpr + + # The `else` keyword + var n_kwelse: TKwelse is writable, noinit end # A `implies` expression @@ -1807,41 +1940,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` @@ -1851,6 +1992,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 @@ -1858,44 +2002,67 @@ 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 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 + +# A unary plus expression. eg `+x` +class AUplusExpr + super AUnaryopExpr + redef fun operator do return "+" - # The `-` symbol - var n_minus: TMinus is writable, noinit end # An explicit instantiation. eg `new T` @@ -2118,7 +2285,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 @@ -2385,22 +2552,68 @@ 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 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 @@ -2500,6 +2713,12 @@ class AAnnotation # The closing parenthesis var n_cpar: nullable TCpar = null is writable + + # The name of the annotation + fun name: String + do + return n_atid.n_id.text + end end # An annotation name