From 742429a15d42325a24a91df93ee726d004618e14 Mon Sep 17 00:00:00 2001 From: Terence Parr Date: Mon, 2 Jun 2014 10:18:56 -0700 Subject: [PATCH] make sure that previous tree node's start/stop token indexes are correct after left-recur elim. --- .../antlr/v4/tool/GrammarTransformPipeline.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tool/src/org/antlr/v4/tool/GrammarTransformPipeline.java b/tool/src/org/antlr/v4/tool/GrammarTransformPipeline.java index 531e3185f..180626eed 100644 --- a/tool/src/org/antlr/v4/tool/GrammarTransformPipeline.java +++ b/tool/src/org/antlr/v4/tool/GrammarTransformPipeline.java @@ -143,6 +143,21 @@ public class GrammarTransformPipeline { GrammarToken newTok = new GrammarToken(g, elWithOpt.getToken()); newTok.originalTokenIndex = Integer.valueOf(options.get(LeftRecursiveRuleTransformer.TOKENINDEX_OPTION_NAME).getText()); elWithOpt.token = newTok; + + GrammarAST originalNode = g.ast.getNodeWithTokenIndex(newTok.getTokenIndex()); + if (originalNode != null) { + // update the AST node start/stop index to match the values + // of the corresponding node in the original parse tree. + elWithOpt.setTokenStartIndex(originalNode.getTokenStartIndex()); + elWithOpt.setTokenStopIndex(originalNode.getTokenStopIndex()); + } + else { + // the original AST node could not be located by index; + // make sure to assign valid values for the start/stop + // index so toTokenString will not throw exceptions. + elWithOpt.setTokenStartIndex(newTok.getTokenIndex()); + elWithOpt.setTokenStopIndex(newTok.getTokenIndex()); + } } } }