我一直在测试一些学生写的一个简单的项目。我正在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文件(包含包laboratoros .lab02),必须由Main.java文件编译和引用。
在Ubuntu上测试makefile时出现了这个问题。对于我尝试的每个配置,我一直得到错误(在编译或运行主java文件时),如:
- . lang。NoClassDefFoundError: org/antlr/v4/runtime/CharStream
- 无法找到或加载主类org.antlr.v4.Tool
- 错误:无法找到或加载主类
我完全按照本教程的步骤在我的pc上设置了antlr:
在多次失败的尝试之后,我得到了这个神奇的配置,使整个项目运行得很好。
Makefile:
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
正如您将在我之前提到的教程(入门ANTLR v4)中发现的那样,它说您应该使用引号来编写Classpath。完全忽略这个建议!每当我使用引号时,主类就不会运行,因为ANTLR"丢失"了。此外,教程中的别名是完全可选的。
值得指出的是,将Makefile放在laboratorio/lab02/文件夹中也没有帮助。将其移出并从外部引用java文件很有帮助。还有人物。":"帮助执行Main类,因为它会说它找不到。