X-Git-Url: http://nitlanguage.org diff --git a/src/parser/parser_work.nit b/src/parser/parser_work.nit index 41d6741..363faf4 100644 --- a/src/parser/parser_work.nit +++ b/src/parser/parser_work.nit @@ -146,7 +146,7 @@ class Parser else if action_type == 3 then # ERROR # skip injected tokens while not isset token._location do token = lexer.next - var node2 = new AParserError.init_parser_error("Syntax error: unexpected {token}.", token.location, token) + var node2 = new AParserError.init_parser_error("Syntax Error: unexpected {token}.", token.location, token) var node = new Start(null, node2) return node end @@ -182,15 +182,15 @@ private class ComputeProdLocationVisitor # Already visited epsilon productions that waits something after them var need_after_epsilons = new Array[Prod] - # Location of the last visited token in the current production - var last_location: nullable Location = null + # The last visited token in the current production + var last_token: nullable Token = null redef fun visit(n: ANode) do if n isa Token then if not isset n._location then return var loc = n._location - _last_location = loc + _last_token = n # Add a first token to productions that need one if not _need_first_prods.is_empty then @@ -217,10 +217,13 @@ private class ComputeProdLocationVisitor var startl = n._first_location if startl != null then # Non-epsilon production - var endl = _last_location - assert endl != null + var endl = _last_token.location - n.location = new Location(startl.file, startl.line_start, endl.line_end, startl.column_start, endl.column_end) + if startl == endl then + n.location = startl + else + n.location = new Location(startl.file, startl.line_start, endl.line_end, startl.column_start, endl.column_end) + end if not _need_after_epsilons.is_empty then var loc = new Location(endl.file, endl.line_end, endl.line_end, endl.column_end, endl.column_end)