ANTLR Ubuntu Java Makefile



我一直在测试一些学生写的一个简单的项目。我正在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类,因为它会说它找不到。

相关内容

  • 没有找到相关文章

最新更新