Доступ к анализируемым данным из парсера в ANTLR4

Я обрабатываю свой входной файл с помощью собственной грамматики, извлекаю токены и возвращаю их в виде HashMap. В ANTLR 3 я смог проанализировать файл, вызвав метод rule() в парсере и получив HashMap что-то вроде parser.record.

Похоже, это не работает в ANTLR 4. Я сослался на книгу и, похоже, мне нужно вызвать parser.init(), чтобы начать синтаксический анализ, но я не вижу никакого метода в моем синтаксическом анализаторе.

Я использовал ANTLRWorks 2 для создания файлов лексера и парсера. Я не создавал классы слушателей.


person javadmirer    schedule 14.03.2013    source источник


Ответы (1)


В ANTLR 4 вы начинаете синтаксический анализ с вызова метода, соответствующего имени правила входа. Если правило в вашей грамматике называется rule, вы должны начать синтаксический анализ с вызова rule(). Если правило в вашей грамматике называется init, вы должны начать синтаксический анализ с вызова init().

Обратите внимание, что цель Java в ANTLR 4 не позволяет вам иметь правило с именем rule, поэтому, если у вас есть такое правило в вашей грамматике, вам необходимо переименовать его, прежде чем грамматика будет скомпилирована.

person Sam Harwell    schedule 14.03.2013
comment
Спасибо, что помогло. Сейчас я имею дело с другой проблемой. Найдите ниже отрывок из моей грамматики. Как видите, я сохраняю значения в HashMap. Мой файл анализируется правильно, но я не могу получить доступ к пост-синтаксическому анализу HashMap. В ANTLR 3 это было так же просто, как parser.metadata. запись: {Map ‹String, String› metadata = new HashMap ‹String, String› (); } header1 WORD * COLD_JOB WORD + doctype {metadata.put (doctype, $ doctype.text);} header2 'Транзакция отправлена:' дата время 'Имя CSR:' WORD + DIGIT 'Идентификатор клиента:' customer_number {metadata.put (thriventId, $ customer_number.text);} - person javadmirer; 15.03.2013