我得到了 Java 编译器子集(称为静态 Java 编译器)的 ANTLR 语法。我正在尝试扩展语法以包含更多 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 行:'Unexpected Token: grammar' 第二个错误在第 5 行:'Unexpected char: @'
为什么它不能识别这个基本的 ANTLR 语法?我的第一个想法是我在类路径中遗漏了一些东西,但我转到项目的属性并确保以下 JAR 包含在库下:
- antlr-2.7.7.jar
- stringtemplate-3.2.1.jar
- antlr.jar
- antlr-runtime-3.0.1.jar
有什么想法或建议吗?
最佳答案
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
从你的项目/类路径,只坚持 this ANTLR v3 JAR在其中(其中包含您需要的一切:运行时、字符串模板、工程!)。
祝你好运!
编辑
就个人而言,我使用 Ant 构建脚本进行 IDE 集成。我像这样生成词法分析器和解析器:
<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!(抱歉敲打那个 :)
))
关于java - 为什么我的 Java ANTLR 语法文件没有编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5236448/