2009-10-13 1 views
6

Рекомендуемый шаблон для использования ANTLR заключается в том, чтобы заставить Parser построить абстрактное дерево синтаксиса, а затем построить Tree walkers (AKA tree grammars) для их обработки.Кто-нибудь знает способ отладки древовидных грамматик в ANTLRWorks

Я пытаюсь понять, почему моя грамматика не работает, и мне бы хотелось использовать отладчик ANTLRWorks так же, как я использовал его для самого анализатора. Ввод в синтаксический анализатор является «исходным кодом», но вход в парсера дерева является результатом анализатора. Я не вижу, как сделать это доступным в качестве входных данных для проверки грамматики дерева.

Неясно, есть ли способ проверить грамматику дерева в ANTLRWorks. Если это можно сделать, указатель в правильном направлении действительно будет оценен.

ответ

6

Отладчик 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. Все это довольно тщательно описано, с большим количеством примеров, чтобы вы начали.

+0

Я думал, что довольно часто искал FAQ, но пропустил эту страницу. Я читал это сейчас и думаю, что я довольно близко. Тем не менее, не работает. Когда вы говорите: «вам нужно использовать инструмент генерации кода ANTLR с флагом« -debug »(я использую цель Java), тогда, когда вы создаете экземпляр парсера дерева», я думаю, что именно там я теряюсь , Вы используете командную строку ANTLR для генерации кода? Я не совсем уверен, где я создаю этот код, и как работает код для не-дерева парсера. –

0

Если вы уверены, что AST, который вы строите, в порядке (с отладчиком ANTLRWORKS), тестирование на древовидную структуру не отличается от тестирования любого другого приложения. Если вы испускаете Java-код, например, используйте отладчик Eclipse для его проверки или обычные сообщения журнала ...

+0

Да , Я перешел к использованию этого метода. ANTLRWorks очень удобен, поэтому я надеялся найти способ проверить мою грамматику дерева, не покидая ANTLRWorks. Это не шоу-стоппер, но было бы неплохо разобраться, как заставить его работать. –

2

Существует способ использовать AntlrWorks:

  1. Написать грамматику в AntlrWorks
  2. Сформировать свой код (это то же самое, как работает Antlr из командной строки без отладки)
  3. Написать себя заглушка подобно тому, что было предложено на Debugging with AntlrWorks faq
  4. Написать грамматику дерева
  5. Выберите Antlrworks отладки (это то же самое, как работает Antlr из командной строки с де флаг ошибки.
  6. Запустите программу заглушки. Программа будет блокировать до тех пор, antlrworks подключена, так что вы можете отлаживать грамматику дерева
  7. Вернуться назад к antlrworks, который имеет грамматику дерева открытой и отладка Remote
  8. Решение проблем .... :)
Смежные вопросы