Отладчик ANTLRWorks должен отлично работать с вашей грамматикой деревьев. Если я правильно помню, вам нужно использовать инструмент генерации кода ANTLR с флагом «-debug» (я использую цель Java), а затем, когда вы создаете экземпляр парсера дерева, используйте конструктор отладки, который принимает порт как Аргумент. В моем случае порт по умолчанию не работал, поэтому я произвольно выбрал 35505.
Запустите ANTLRWorks, откройте свою грамматику деревьев, нажмите «Запустить» -> «Отладка удаленного ...», установите порт в то же значение, которое используется в конструкторе для вашего парсера дерева, и вы должны иметь возможность подключить отладчик к вашему запущенному приложению. Подробности см. На странице ANTLR 3 Debugging FAQ.
[Update] Предполагая, что вы используете цель 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();
Я настоятельно рекомендую получить копию The Definitive ANTLR Reference, если вы собираетесь использовать ANTLR. Все это довольно тщательно описано, с большим количеством примеров, чтобы вы начали.
Я думал, что довольно часто искал FAQ, но пропустил эту страницу. Я читал это сейчас и думаю, что я довольно близко. Тем не менее, не работает. Когда вы говорите: «вам нужно использовать инструмент генерации кода ANTLR с флагом« -debug »(я использую цель Java), тогда, когда вы создаете экземпляр парсера дерева», я думаю, что именно там я теряюсь , Вы используете командную строку ANTLR для генерации кода? Я не совсем уверен, где я создаю этот код, и как работает код для не-дерева парсера. –