JavaCC参考程序正在循环

JavaCC reference program is looping

我正在学习 JavaCC,因此开始研究来自 Brazilian university 的示例。

使用 JavaCC gradle 插件对文件进行编码和编译工作正常。但是,当使用输入调用生成的 class 时,程序似乎处于空闲状态,就好像它在等待输入一样。

java Adder 123 + 1  
  

实际上,解析器将 System.in 定义为加法器 class 的参数(请参阅下面的源代码)。因此,我只尝试 运行 Adder 文件并在之后键入输入。不过,这具有相同的效果。

java Adder
123 + 1    

我还尝试了使用字符串文字 "" 并在末尾附加 \n 的不同组合,因为 BNF 期望在表达式之后出现 EOF。

预编辑:我能够部分解决问题,但还是决定 post 这个问题,因为将来它也可能与其他人有关。本教程使用 < 运算符为程序提供输入。我 运行 java 在我的 Ubuntu WSL 安装上使用相同的命令让它工作。有趣的是,它在 Windows 上不起作用(即使教程显然使用相同的 OS 系列 - 但可能与他们在某些时候提到的 Windows 2000 不同的版本......去图)。

java Adder < input.txt

input.txt的内容:123 + 1

为了完整 运行sparency,我添加了 .jj 和 gradle 配置

build.gradle:

plugins {
    id 'java'
    id "ca.coglinc.javacc" version "2.4.0"
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

compileJavacc {
    inputDirectory = file('src/main/java/javacc')
    outputDirectory = file(project.buildDir.absolutePath + '/generated/javacc')
}

Parser.jj

// Parser specification
options {
    STATIC = false ;
}
PARSER_BEGIN(Adder)
    public class Adder {
        public static void main( String[] args ) throws ParseException, TokenMgrError {
//            System.out.println("Initializing adder...");
            Adder parser = new Adder( System.in ) ;
//            System.out.println("Parsing input...");
            parser.Start() ;
//            System.out.println("done");
        }
    }
PARSER_END(Adder)

// Lexical analyzer specification
SKIP : { " " }
SKIP : { "\n" | "\r" | "\r\n" }
TOKEN : { < PLUS : "+" > }
TOKEN : { < NUMBER : (["0"-"9"])+ > }

void Start() : {}
{
    <NUMBER>
     (
         <PLUS>
         <NUMBER>
     )*
     <EOF>
}

我已经研究了一段时间,所以不妨归结为一个细节。明天我会以全新的心态再试一次,并检查这里的输入。

一切顺利。

当 运行 来自 WSL 的命令 java Adder