Кто-нибудь знает способ отладки древовидных грамматик в ANTLRWorks - PullRequest
6 голосов
/ 13 октября 2009

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

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

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

Ответы [ 3 ]

6 голосов
/ 21 октября 2009

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

2 голосов
/ 08 августа 2012

Есть способ использовать AntlrWorks:

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

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

...