Я пытаюсь написать фрагмент кода, который возьмет анализатор ANTLR4 и будет использовать его для генерации AST для входных данных, аналогичных тем, которые задает параметр -tree в grun (misc.TestRig
). Однако я бы также хотел, чтобы вывод включал всю информацию о номере / смещении строки.
Например, вместо печати
(add (int 5) '+' (int 6))
Я бы хотел получить
(add (int 5 [line 3, offset 6:7]) '+' (int 6 [line 3, offset 8:9]) [line 3, offset 5:10])
Или что-то подобное.
Пока не так много примеров посетителей для ANTLR4, но я почти уверен, что смогу сделать большую часть этого, скопировав реализацию по умолчанию для toStringTree
(используется grun). Однако я не вижу никакой информации о номерах строк или смещениях.
Я ожидал, что смогу написать такой супер простой код:
String visit(ParseTree t) {
return "(" + t.productionName + t.visitChildren() + t.lineNumber + ")";
}
но это, кажется, не так просто. Я предполагаю, что смогу получить информацию о номере строки от парсера, но я не понял, как это сделать. Как я могу получить эту информацию о номере строки / смещении в моем обходе?
Чтобы заполнить несколько пробелов в приведенном ниже решении, я использовал:
List<String> ruleNames = Arrays.asList(parser.getRuleNames());
parser.setBuildParseTree(true);
ParserRuleContext prc = parser.program();
ParseTree tree = prc;
чтобы получить tree
и ruleNames
. program
- это название лучшей продукции в моей грамматике.
toStringTree
метода. Один принимаетParser
экземпляр, а другой простоList<String>
имен правил. - person Sam Harwell   schedule 14.10.2013toStringTree
с аргументом парсера заставляет реализацию захватить список правил (recog.getRuleNames()
) и передать егоtoStringTree
, который принимаетList
. Во всяком случае, это все еще не объясняет, как получить информацию о номере строки / смещении при написании посетителя. - person Chucky Ellison   schedule 14.10.2013