JavaCC简单示例不起作用

时间:2017-07-04 11:41:32

标签: javacc

我第一次尝试使用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源类。我的主要课程如下:

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)

有任何解决问题的提示吗?

1 个答案:

答案 0 :(得分:1)

修改请注意,此答案会回答问题的早期版本。

当BNF制作使用返回结果的非终结符时,您可以将该结果记录在变量中。

首先在BNF生产的声明部分声明变量

int expr():
{
    int leftValue ;
    int rightValue ;
}
{

其次,在生产的主体中,将结果记录在变量中。

    leftValue = num()
    "+"
    rightValue = num()

最后,使用这些变量的值来计算此生产的结果。

    { return leftValue+rightValue; }
}