Отладчик ANTLRWorks должен нормально работать с вашей древовидной грамматикой. Если я правильно помню, вам нужно использовать инструмент генерации кода ANTLR с флагом «-debug» (я использую цель Java), а затем, когда вы создаете свой экземпляр синтаксического анализатора дерева, используйте конструктор отладки, который принимает порт как Аргумент. В моем случае порт по умолчанию не работал, поэтому я произвольно выбрал 35505.
Запустите ANTLRWorks, откройте грамматику дерева, нажмите «Выполнить» -> «Отладка удаленного ...», установите для порта то же значение, которое использовалось в конструкторе для вашего синтаксического анализатора дерева, и вы сможете подключить отладчик вашего запущенного приложения. Подробнее см. ANTLR 3 .
[ Обновление ] Предполагается, что вы используете цель Java (сообщите нам, если это не так), вот более подробная информация о начале работы:
Когда вы тестируете синтаксический анализатор, не относящийся к дереву, в ANTLRWorks, есть закулисный процесс, который генерирует код Java из вашего файла грамматики, а затем использует этот код для анализа вашего ввода. Когда вы используете свой синтаксический анализатор в своем собственном приложении, вы должны использовать ANTLR (в частности, класс org.antlr.Tool
) для генерации Java-кода, который затем можно включить в ваше приложение. Для этого в ANTLRWorks есть пункт меню, с которого следует начать. В моем случае в моем файле сборки ant есть цель, которая генерирует код Java из моих грамматик и помещает эти исходные файлы Java в место, где их может найти остальная часть моего приложения. Моя муравьиная мишень выглядит примерно так:
<java classpath="${antlr.tool.classpath}" classname="org.antlr.Tool" failonerror="true">
<arg value="-o" />
<arg value="${antlr.out.dir}" />
<arg value="${grammar.dir}/GrammarName.g" />
</java>
Свойство antlr.tool.classpath
должно содержать stringtemplate.jar
и antlr.jar
, а antlr.out.dir
должно указывать на каталог, в который вы хотите сгенерировать исходный код (например, build/antlr/src/org/myorg/antlr/parser
, если ваши грамматики синтаксического анализатора указывают пакет org.myorg.antlr.parser
).
Затем, когда вы компилируете оставшуюся часть приложения, вы можете использовать что-то вроде:
<javac destdir="${build.classes.dir}" debug="on" optimize="on" deprecation="${javac.deprecation}" source="${javac.source}" target="${javac.target}">
<classpath refid="stdclasspath"/>
<src path="${src.dir}" />
<src path="${antlr.src.dir}" />
</javac>
Здесь мы компилируем исходные коды нашего приложения (в src.dir
) вместе с сгенерированным кодом ANTLR (в antlr.src.dir
, который в этом примере будет build/antlr/src
).
Что касается использования сгенерированного кода в вашем приложении (т. Е. Вне ANTLRWorks), вам необходимо выполнить что-то вроде:
String sourceText = "a + b = foo";
ANTLRStringStream inStream = new ANTLRStringStream(sourceText);
// your generated lexer class
MyLexer lexer = new MyLexer(inStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
// your generated parser class
MyParser parser = new MyParser(tokens);
// run the toplevel rule (in this case, `program`)
MyParser.program_return prog = parser.program();
// get the resulting AST (a CommonTree instance, in this case)
CommonTree tree = (CommonTree) prog.getTree();
// run a tree parser rule on the AST
MyTreeParser treeParser = new MyTreeParser(new CommonTreeNodeStream(tree));
treeParser.program();
Я настоятельно рекомендую получить копию Definitive ANTLR Reference , если вы собираетесь использовать ANTLR. Все это освещено довольно подробно, с множеством примеров, с которых можно начать.