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.:

  • 相关阅读:
    分布式任务调度 xxl-job
    【线上】 select * from xxoo where 1=1应用挂掉
    【死磕ES】七、基础检索
    【死磕ES】四、基本操作
    【死磕ES】三、基本概念
    【死磕ES】二、搭建环境
    Mac共享文件夹
    微信小程序下拉刷新,上拉加载
    微信小程序textarea输入框出现[object Object]
    微信小程序official-account的使用
  • 原文地址:https://www.cnblogs.com/suhaha/p/11733699.html
Copyright © 2011-2022 走看看