我一直在尝试测试一些学生编写的一个简单项目。我在 Ubuntu 上测试它,该项目要求我使用 ANTLR 和 Makefile。 找到能够成功编译和执行的 makefile、文件和文件夹的配置是一场噩梦。
基本上这是文件夹/文件设置:
Makefile
test.txt
laboratorio/
lab02/
Main.java
Lab02.g
Main.java 的内容相当简单。他们只是逐个读取语法标记:
package laboratorios.lab02;
import org.antlr.v4.runtime.*;
public class Main{
public static void main(String[] args) throws Exception{
try{
Lab02 lexer = new Lab02(new ANTLRFileStream(args[0]));
while (lexer.nextToken().getType() != Token.EOF);
}catch(ArrayIndexOutOfBoundsException aiobe){
System.err.println("Must provide a valid path to the filename with the tokens");
System.exit(1);
}catch(Exception e){
System.err.println("Must provide a valid path to the filename with the tokens");
System.exit(1);
}
}
}
Lab02.g 的内容(语法)与问题无关,但它生成一个 Lab02.java 文件(带有包 Laboratorios.lab02),该文件必须由 Main.java 文件编译和引用。
尝试在 Ubuntu 上测试 makefile 时出现问题。对于我尝试的每个配置,我不断收到错误(在编译或运行主 java 文件时),例如:
- java.lang.NoClassDefFoundError: org/antlr/v4/runtime/CharStream
- 无法找到或加载主类org.antlr.v4.Tool
- 错误:无法找到或加载主类
我已经按照本教程的具体步骤在我的电脑上设置了antlr:Getting Started with ANTLR v4
最佳答案
经过多次不成功的尝试,我得到了这个神奇的配置,它使整个项目运行良好。
生成文件:
make: gramatica main
gramatica: laboratorios/lab02/Lab02.g
java org.antlr.v4.Tool laboratorios/lab02/Lab02.g
main: laboratorios/lab02/Lab02.java laboratorios/lab02/Main.java
javac laboratorios/lab02/Lab02.java laboratorios/lab02/Main.java
run: laboratorios/lab02/Main.class
java -cp ${CLASSPATH}:Lab02.class laboratorios/lab02/Main test.txt
clean:
rm -rf laboratorios/lab02/*.tokens
rm -rf laboratorios/lab02/*.class
rm -rf laboratorios/lab02/Lab02.java
rm -rf laboratorios/lab02/*~
我要求我在 bashrc 中设置 CLASSPATH,如下所示:
export CLASSPATH=.:~/your/path/to/antlr/antlr-4.2-complete.jar
正如您在我之前提到的教程 ( Getting Started with ANTLR v4 ) 中发现的那样,它表示您应该使用引号编写类路径。完全忽略这个建议!每当我使用引号时,主类都不会运行,因为 ANTLR 已“丢失”。此外,教程中的别名是完全可选的。
其他一些值得指出的事情是将 Makefile 放在 Laboratorio/lab02/文件夹中也没有帮助。将其移出并从外部引用 java 文件有很大帮助。字符“.:”帮助执行 Main 类,因为它会说找不到它。
关于java - ANTLR Ubuntu Java Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25400930/