Почему мой файл грамматики ANTLR для Java не компилируется?

Мне дали грамматику ANTLR для подмножества компилятора Java, известного как статический компилятор Java. Я пытаюсь расширить грамматику, включив в нее больше возможностей Java, например, я только что добавил грамматику для For Loops.

Затем, используя Eclipse и подключаемый модуль ANTLR, я выполнил «Компиляцию грамматики ANTLR». Вместо компиляции он произвел две ошибки в первом бите кода:

grammar ExtendedStaticJava;

options { backtrack=true; memoize=true; }

@header
{
package sjc.parser.extended;
import java.math.BigInteger;

/**
 * Extended StaticJava parser.
 * @author <myname>
 */
}

// the rest of the grammar has been excluded.

Первая ошибка находится в строке 1: «Неожиданный токен: грамматика» Вторая ошибка находится в строке 5: «Неожиданный символ: @»

Почему он не распознает этот базовый синтаксис ANTLR? Моя первая мысль заключалась в том, что мне чего-то не хватает в пути к классам, но я зашел в свойства проекта и убедился, что следующие JAR-файлы включены в Библиотеки:

  • antlr-2.7.7.jar
  • stringtemplate-3.2.1.jar
  • antlr.jar
  • antlr-runtime-3.0.1.jar

Есть идеи или предложения?


person jbranchaud    schedule 08.03.2011    source источник


Ответы (3)


antlr-2.7.7.jar неверно: ваша грамматика в синтаксисе ANTLR v3 +. Убрать все:

  • antlr-2.7.7.jar
  • stringtemplate-3.2.1.jar
  • antlr.jar
  • antlr-runtime-3.0.1.jar

из вашего проекта / пути к классам и вставьте в него только этот ANTLR v3 JAR (который содержит все, что вам нужно: время выполнения, шаблон строки, все работает!).

Удачи!


РЕДАКТИРОВАТЬ

Лично я интегрирую свою IDE с помощью сценария сборки Ant. Я создаю лексер и парсер следующим образом:

<target name="generate.parser" depends="init" description="Generates the lexer, parser and tree-walker from the grammar files.">
    <echo>Generating the lexer and parser...</echo>
    <java classname="org.antlr.Tool" fork="true" failonerror="true">
        <arg value="-fo" />
        <arg value="${main.src.dir}/${parser.package}" />
        <arg value="${parser.grammar.file}" />
        <classpath refid="classpath" />
    </java>
    <!-- snip -->
</target>

и classpath refid выглядит так:

<path id="classpath">
    <!-- snip -->
    <fileset dir="lib">
        <include name="*.jar" />
    </fileset>
</path>

а каталог lib/ содержит ANTLR v3 JAR (никаких других ANTLR JAR! (извините за то, что забил этот :)))

person Bart Kiers    schedule 08.03.2011
comment
Похоже, это не сработало. В Eclipse я щелкнул правой кнопкой мыши по проекту, выбрал свойства, затем «Путь сборки Java» - ›Библиотеки. Отсюда я удалил все банки, которые вы указали выше, и добавил antlr-3.2.jar из предоставленной вами ссылки. Это дает мне те же ошибки, что и раньше. - person jbranchaud; 08.03.2011
comment
@Treebranch, единственный совет, который я могу дать, - если вы не на 100% уверены в том, как инструменты работают друг с другом, не используйте инструменты. В вашем случае вы не на 100% уверены, как взаимодействуют Eclipse и ANTLR: не используйте их вместе, а вместо этого используйте ANTLR с командной строкой. Я могу сказать вам одну вещь: я уверен, что ваш 2.7 JAR не соответствует фрагменту грамматики, которую вы опубликовали, и отдельные библиотеки времени выполнения или строковых шаблонов не нужны с JAR, который я связал. Удачи! - person Bart Kiers; 08.03.2011
comment
@Treebranch, если вы опубликуете свою грамматику, я могу показать вам, как без проблем сгенерировать парсер и лексер в командной строке! - person Bart Kiers; 09.03.2011
comment
Я ценю это предложение, но дело не в том, что я не могу сгенерировать парсер и лексер. На самом деле я могу сделать это с помощью ANTLRWorks. Проблема в том, что я хочу, чтобы он был в Eclipse, чтобы я мог запускать свои тесты JUnit против него. - person jbranchaud; 09.03.2011
comment
@Treebranch, а, понятно. В этом случае проверьте мой EDIT. Удачи! - person Bart Kiers; 09.03.2011

Вероятно, вы установили подключаемый модуль AntlrEclipse. Это действительно использует Antlr 2.7.something. Однако существует подключаемый модуль, который работает с v3, Antlr IDE. Этот плагин является немного более продвинутым, поскольку он позволяет вам настраивать версию Antlr (3+) и может отображать представление железной дороги и имеет интерпретатор.

Примечание Если вы используете Eclipse Juno, вам нужно будет установить DLTK из репозиториев Indigo, поскольку 4.0.0 является новой для плагина antlr

person Joost    schedule 21.08.2012

У меня тоже была эта проблема.

В какой-то момент во время моих попыток запустить antlr я добавил некоторую версию файла jar в свою переменную среды Windows пути к классам. Я удалил эту запись, и это решило мою проблему.

person CrashCodes    schedule 03.01.2012