zoukankan      html  css  js  c++  java
  • 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 : "
    " | "
    " | "
    " > }
    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.:

  • 相关阅读:
    Unity3D串口处理
    Crixalis's Equipment 杭电 (设计贪心算法,比较巧妙,我用的是结构体排序)
    杭电 看归并排序和快速排序
    杭电acm 排名 (涉及到结构体排序)
    程序在计算机的内存(看到了一篇博客,解决了我的疑惑)
    贪心算法and排序 杭电一题的启发
    辗转相除法 杭电acm
    单调队列
    用栈的思想处理字符串倒置问题更清晰
    VS的哪些事儿之二
  • 原文地址:https://www.cnblogs.com/suhaha/p/11733699.html
Copyright © 2011-2022 走看看