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
我正在学习 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