JavaCC 简单示例不起作用
JavaCC simple example not working
我第一次尝试 javacc 时使用了一个无法正常工作的简单示例。我的BNF如下:
<exp>:= <num>"+"<num>
<num>:= <digit> | <digit><num>
<digit>:= [0-9]
基于这个BNF,我写SimpleAdd.jj
如下:
options
{
}
PARSER_BEGIN(SimpleAdd)
public class SimpleAdd
{
}
PARSER_END(SimpleAdd)
SKIP :
{
" "
| "\r"
| "\t"
| "\n"
}
TOKEN:
{
< NUMBER: (["0"-"9"])+ >
}
int expr():
{
int leftValue ;
int rightValue ;
}
{
leftValue = num()
"+"
rightValue = num()
{ return leftValue+rightValue; }
}
int num():
{
Token t;
}
{
t = <NUMBER> { return Integer.parseInt(t.toString()); }
}
使用上述文件,我正在生成 java 源 classes。我的主要class如下:
public class Main {
public static void main(String [] args) throws ParseException {
SimpleAdd parser = new SimpleAdd(System.in);
int x = parser.expr();
System.out.println(x);
}
}
当我通过 System.in 输入表达式时,出现以下错误:
11+11^D
Exception in thread "main" SimpleAddTest.ParseException: Encountered "<EOF>" at line 0, column 0.
Was expecting:
<NUMBER> ...
at SimpleAddTest.SimpleAdd.generateParseException(SimpleAdd.java:200)
at SimpleAddTest.SimpleAdd.jj_consume_token(SimpleAdd.java:138)
at SimpleAddTest.SimpleAdd.num(SimpleAdd.java:16)
at SimpleAddTest.SimpleAdd.expr(SimpleAdd.java:7)
at SimpleAddTest.Main.main(Main.java:9)
有什么解决问题的提示吗?
编辑 请注意,此答案回答了问题的早期版本。
当 BNF 产生式使用 returns 结果的非终结符时,您可以将该结果记录在变量中。
首先在BNF产生式的声明部分声明变量
int expr():
{
int leftValue ;
int rightValue ;
}
{
其次,在制作主体中,将结果记录在变量中。
leftValue = num()
"+"
rightValue = num()
最后,使用这些变量的值来计算产生式的结果。
{ return leftValue+rightValue; }
}
我第一次尝试 javacc 时使用了一个无法正常工作的简单示例。我的BNF如下:
<exp>:= <num>"+"<num>
<num>:= <digit> | <digit><num>
<digit>:= [0-9]
基于这个BNF,我写SimpleAdd.jj
如下:
options
{
}
PARSER_BEGIN(SimpleAdd)
public class SimpleAdd
{
}
PARSER_END(SimpleAdd)
SKIP :
{
" "
| "\r"
| "\t"
| "\n"
}
TOKEN:
{
< NUMBER: (["0"-"9"])+ >
}
int expr():
{
int leftValue ;
int rightValue ;
}
{
leftValue = num()
"+"
rightValue = num()
{ return leftValue+rightValue; }
}
int num():
{
Token t;
}
{
t = <NUMBER> { return Integer.parseInt(t.toString()); }
}
使用上述文件,我正在生成 java 源 classes。我的主要class如下:
public class Main {
public static void main(String [] args) throws ParseException {
SimpleAdd parser = new SimpleAdd(System.in);
int x = parser.expr();
System.out.println(x);
}
}
当我通过 System.in 输入表达式时,出现以下错误:
11+11^D
Exception in thread "main" SimpleAddTest.ParseException: Encountered "<EOF>" at line 0, column 0.
Was expecting:
<NUMBER> ...
at SimpleAddTest.SimpleAdd.generateParseException(SimpleAdd.java:200)
at SimpleAddTest.SimpleAdd.jj_consume_token(SimpleAdd.java:138)
at SimpleAddTest.SimpleAdd.num(SimpleAdd.java:16)
at SimpleAddTest.SimpleAdd.expr(SimpleAdd.java:7)
at SimpleAddTest.Main.main(Main.java:9)
有什么解决问题的提示吗?
编辑 请注意,此答案回答了问题的早期版本。
当 BNF 产生式使用 returns 结果的非终结符时,您可以将该结果记录在变量中。
首先在BNF产生式的声明部分声明变量
int expr():
{
int leftValue ;
int rightValue ;
}
{
其次,在制作主体中,将结果记录在变量中。
leftValue = num()
"+"
rightValue = num()
最后,使用这些变量的值来计算产生式的结果。
{ return leftValue+rightValue; }
}