X-Git-Url: http://nitlanguage.org diff --git a/src/parser_util.nit b/src/parser_util.nit index f23ccda..cd4f205 100644 --- a/src/parser_util.nit +++ b/src/parser_util.nit @@ -30,7 +30,7 @@ redef class ToolContext var eof = tree.n_eof if eof isa AError then - self.fatal_error(null, "Fatal Error: {eof.message}") + self.fatal_error(null, "Fatal Error: {eof.message}.") abort end return tree.n_base.as(not null) @@ -43,7 +43,7 @@ redef class ToolContext var nmodule = parse_module(string) var nclassdefs = nmodule.n_classdefs if nclassdefs.length != 1 then - self.fatal_error(null, "Fatal Error: not a classdef") + self.fatal_error(null, "Fatal Error: not a classdef.") abort end return nclassdefs.first @@ -57,7 +57,7 @@ redef class ToolContext var nclassdef = parse_classdef(mod_string) var npropdefs = nclassdef.n_propdefs if npropdefs.length != 1 then - self.fatal_error(null, "Fatal Error: not a propdef") + self.fatal_error(null, "Fatal Error: not a propdef.") abort end return npropdefs.first @@ -83,6 +83,20 @@ redef class ToolContext return nexpr end + # Parse a super class declaration + # Fatal error if the `string` is not a syntactically correct super class declaration + fun parse_superclass(string: String): APropdef + do + var mod_string = "class Dummy\nsuper {string}\nend" + var nclassdef = parse_classdef(mod_string).as(AStdClassdef) + var nsuperclasses = nclassdef.n_propdefs + if nsuperclasses.length != 1 then + self.fatal_error(null, "Fatal Error: not a super class declaration.") + abort + end + return nsuperclasses.first + end + # Try to parse the `string` as something # # Returns the first possible syntacticaly correct type among: @@ -208,10 +222,15 @@ redef class ToolContext end end +# A modified lexer that feed tokens before and after the real tokens. class InjectedLexer super Lexer + # The tokens to use before the real tokens (in order). var injected_before = new List[Token] + + # The tokens to use after the real tokens (in order). + # The real EOF token is produced after these tokens. var injected_after = new List[Token] private var is_finished = false @@ -232,46 +251,3 @@ class InjectedLexer return tok end end - -redef class ANode - # 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 - - # Return an array of node that are annotated - # The attached node can be retrieved by two invocation 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 - init(text: String) do self.text = text - 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 - init(name: String) do self.name = name - 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