Понимание деревьев в ANTLR
Я пытаюсь использовать Antlr для некоторых текстовых IDE-подобных функций-в частности, для анализа файла для определения точек для сворачивания кода и для применения подсветки синтаксиса.
первый вопрос-Antlr подходит для этого требования, или это перебор? Это мог бы достигано используя regex и / или ручной парсер ... но мне кажется, что Antlr, чтобы сделать эту работу для меня.
Я просмотрел ... и отличный учебник ресурс здесь.
мне удалось создать грамматику Java (используя стандартные грамматики), и получить все разбирается аккуратно в дерево. Однако я ожидал увидеть элементы, вложенные в дерево. На самом деле, все является дочерним элементом самого верхнего элемента.
например. Дано:
package com.example
public class Foo {
String myString = "Hello World"
// etc
}
я ожидал, что узел дерева для Foo будет дочерним узлом узла для объявления пакета. Также, моя струна - дитя Фу.
вместо этого, я нахожу, что Foo
и myString
(и все остальное в этом отношении) все дети package
.
вот соответствующий отрывок, выполняющий разбор:
public void init() throws Exception {
CharStream c = new ANTLRFileStream(
"src/com/inversion/parser/antlr/Test.code");
Lexer lexer = new JavaLexer(c);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
parser.setTreeAdaptor(adaptor);
compilationUnit_return result = parser.compilationUnit();
}
static final TreeAdaptor adaptor = new CommonTreeAdaptor() {
public Object create(Token payload) {
if (payload != null)
{
System.out.println("Create " + JavaParser.tokenNames[payload.getType()] + ": L" + payload.getLine() + ":C" + payload.getCharPositionInLine() + " " + payload.getText());
}
return new CommonTree(payload);
}
};
изучение result.getTree()
возвращает CommonTree
экземпляр, дети которого являются результатом синтаксического анализа.
ожидаемое значение (возможно, неправильно)
package com.example (4 tokens)
|
+-- public class Foo (3 tokens)
|
+--- String myString = "Hello World" (4 tokens)
+--- Comment "// etc"
(или что-то похожие)
фактическое значение (все значения являются дочерними для корневого узла result.getTree()
)
package
com
.
example
public
class
Foo
String
myString
=
"Hello World"
это мое понимание как это должно работать правильно?
я полный нуб в Antlr до сих пор, и я нахожу кривую обучения довольно крутой.
2 ответов
грамматика Java-6 в верхней части раздела общего доступа к файлам наantlr.org не включает в себя дерево здания. Тебе нужно сделать две вещи. Во-первых, скажите ANTLR, что вы хотите построить AST:
options {
output=AST;
}
во-вторых, вы должны сказать ему, как должно выглядеть дерево, используя операторы дерева или правила перезаписи. Вижу документация по строительству деревьев. Обычно я делаю комбинацию того и другого.
чтобы построить дерево, вы должны установить output=AST. (Абстрактное синтаксическое дерево)
насколько я знаю, в ANTLR только 1 токен может быть корнем дерева, поэтому вы не можете получить именно то, что ищете, но вы можете приблизиться.
проверить: http://www.antlr.org/wiki/display/ANTLR3/Tree + строительство