X-Git-Url: http://nitlanguage.org diff --git a/lib/nitcc_runtime.nit b/lib/nitcc_runtime.nit index 3aa2810..51ee0c8 100644 --- a/lib/nitcc_runtime.nit +++ b/lib/nitcc_runtime.nit @@ -186,12 +186,14 @@ abstract class Lexer last_state = state end var c + var next if pos >= length then c = '\0' + next = null else - c = text[pos] + c = text.chars[pos] + next = state.trans(c) end - var next = state.trans(c) if next == null then if pos_start < length then if last_state == null then @@ -306,6 +308,9 @@ abstract class Node # A point of view on the direct children of the node fun children: SequenceRead[nullable Node] is abstract + # A point of view of a depth-first visit of all non-null children + var depth: Collection[Node] = new DephCollection(self) + # Visit all the children of the node with the visitor `v` protected fun visit_children(v: Visitor) do @@ -362,6 +367,42 @@ abstract class Node end end +private class DephCollection + super Collection[Node] + var node: Node + redef fun iterator do return new DephIterator([node].iterator) +end + +private class DephIterator + super Iterator[Node] + var stack = new List[Iterator[nullable Node]] + + init(i: Iterator[nullable Node]) + do + stack.add i + end + + redef fun is_ok do return not stack.is_empty + redef fun item do return stack.last.item.as(not null) + redef fun next + do + var i = stack.last + stack.push i.item.children.iterator + i.next + while is_ok do + if not stack.last.is_ok then + stack.pop + continue + end + if stack.last.item == null then + stack.last.next + continue + end + return + end + end +end + # A token produced by the lexer and used in a syntactic tree abstract class NToken super Node @@ -426,14 +467,15 @@ end class NLexerError super NError - redef fun unexpected do return "character '{text.first}'" + redef fun unexpected do return "character '{text.chars.first}'" end # A parser error linked to a unexpected token class NParserError super NError + # The unexpected token - var token: nullable NToken + var token: nullable NToken = null redef fun unexpected do @@ -509,7 +551,7 @@ abstract class TestParser var filepath = args.shift var text if filepath == "-" then - text = stdin.read_all + text = sys.stdin.read_all else if filepath == "-e" then if args.is_empty then print "Error: -e need a text" @@ -562,7 +604,7 @@ abstract class TestParser tpv.enter_visit(n) n = n.error_tree else - print "ROOT: {n} (see {astout} and {astdotout})" + print "ROOT: {n}; {n.depth.length} nodes (see {astout} and {astdotout})" end tpv.enter_visit(n) n.to_dot(astdotout)