象牙酥 Missing My Rainbow

9.JavaCC官方入门指南-例4

例4:计算器--添加减法运算

1. calculator1.jj

  为了使得计算器具备更多功能,我们需要更多的操作符,比如减法、乘法和除法。接下来我们添加减法运算。
  在词法分析器的描述部分,我们添加如下生产式:

TOKEN : { < MINUS : "-" > }

  在词法分析器的描述文件中,我们层在定义EOL和NUMBER这两个token时,使用竖线来表示“或”的意思,以此来区分不同的选项。在语法分析器的BNF生产式中,我们也同样用竖线来表示“或”的功能。
  在这个例子中,我们需要在PLUS和MINUS这两个token之间做选择。用BNF符号表达式来表示就如下所示:

Expression --> Primary ((PLUS | MINUS) Primary) *

  但是我们也可以使用如下表示:

Expression --> Primary (PLUS Primary | MINUS Primary)*

  这种方式使得生成的java代码简单些,在JavaCC描述文件中,其对应的生产式如下所示:

double Expression() throws NumberFormatException :
{
    double i ;
    double value ;
}
{
    value = Primary()
    (
        <PLUS>
            i = Primary()
            { value += i ; }
        | <MINUS>
            i = Primary()
            { value -= i ; }
    )*
    { return value ; }
}

2.测试

  经过上面的修改,修改之后完整的.jj文件内容如下所示:

/* calculator0.jj An interactive calculator. */
options {
    STATIC = false ;
}
PARSER_BEGIN(Calculator)
    import java.io.PrintStream ;
    class Calculator {
        public static void main( String[] args )
            throws ParseException, TokenMgrError, NumberFormatException {
            Calculator parser = new Calculator( System.in ) ;
            parser.Start( System.out ) ;
        }
        double previousValue = 0.0 ;
    }
PARSER_END(Calculator)


SKIP : { " " }
TOKEN : { < EOL : "\n" | "\r" | "\r\n" > }
TOKEN : { < PLUS : "+" > }
TOKEN : { < MINUS : "-" > }
TOKEN : { < NUMBER : <DIGITS>
                   | <DIGITS> "." <DIGITS>
                   | <DIGITS> "."
                   | "."<DIGITS> >
        }
TOKEN : { < #DIGITS : (["0"-"9"])+ > }


void Start(PrintStream printStream) throws NumberFormatException :
{}
{
    (
        previousValue = Expression()
        <EOL> { printStream.println( previousValue ) ; }
    )*
    <EOF>
}

double Expression() throws NumberFormatException :
{
    double i ;
    double value ;
}
{
    value = Primary()
    (
        <PLUS>
            i = Primary()
            { value += i ; }
        | <MINUS>
            i = Primary()
            { value -= i ; }
    )*
    { return value ; }
}


double Primary() throws NumberFormatException :
{
    Token t ;
}
{
    t = <NUMBER>
    { return Double.parseDouble( t.image ) ; }
}

编译

测试1+2:

测试 4-3:

测试6.6-4.:

posted @ 2019-10-24 17:40  象牙酥  阅读(949)  评论(0编辑  收藏