Search code examples
javacc

JavaCC simple example not working


I am trying javacc for the first time with a simple naive example which is not working. My BNF is as follows:

<exp>:= <num>"+"<num>
<num>:= <digit> | <digit><num>
<digit>:= [0-9]

Based on this BNF, I am writing the SimpleAdd.jj as follows:

    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()); }
}

using the above file, I am generating the java source classes. My main class is as follows:

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);
    }
}

When I am entering the expression via System.in, I am getting the following error:

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)

Any hint to solve the problem ?


Solution

  • Edit Note that this answer answers an earlier version of the question.

    When a BNF production uses a nonterminal that returns a result, you can record that result in a variable.

    First declare the variables in the declaration part of the BNF production

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

    Second, in the main body of the production, record the results in the variables.

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

    Finally, use the values of those variables to compute the result of this production.

        { return leftValue+rightValue; }
    }