Понимание деревьев в 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 + строительство