zoukankan      html  css  js  c++  java
  • 利用JAVACC实现简单的四则运算

    代码

    /**
     * JavaCC template file created by SF JavaCC plugin 1.5.28+ wizard for JavaCC 1.5.0+
     */
    options
    {
      static = true;
    }
    
    PARSER_BEGIN(Calculator)
    package calculator;
    import java.io.*;
    
    public class Calculator
    {
      public static void main(String args []) throws NumberFormatException,ParseException,TokenMgrError,FileNotFoundException
      {
        FileInputStream fis = new FileInputStream("src/calculator/input.txt");
        System.setIn(fis);
        Calculator parser = new Calculator(System.in);
        parser.Start(System.out);
      }
      
      static double previousValue = 0.0;    
    }
    
    PARSER_END(Calculator)
    
    SKIP : {" "}
    
    TOKEN : /* OPERATORS */
    {
      < PLUS : "+" >
    | < MINUS : "-" >
    | < MULTIPLY : "*" >
    | < DIVIDE : "/" >
    }
    
    TOKEN : { < EOL : "
    " | "
    " | "
    "> }
    
    TOKEN :
    {
      < NUMBER : < DIGITS> | < DIGITS> "." < DIGITS> | < DIGITS> "." | "." < DIGITS> >
    | < #DIGITS : ([ "0"-"9" ])+ >
    }
    
    TOKEN :
    {
      < OPEN_PAR : "(">
    | < CLOSE_PAR : ")">
    | < PREVIOUS : "$">
    }
    
    void Start(PrintStream printstream) throws NumberFormatException:
    {}
    {
    	(
    	  previousValue = Expression()
    	  < EOL >
    	  { printstream.println(previousValue);}
    	)*
    	< EOF >
    }
    
    double Expression() throws NumberFormatException:
    {
    	double i;
    	double value;
    }
    {
    	value = Term()
    	(
    	  < PLUS >
    	  i = Term()
    	  { value += i;}
    	| < MINUS >
    	  i = Term()
    	  { value -= i;} 	
    	)*
    	{ return value; }
    }
    
    double Term() throws NumberFormatException:
    {
    	double i;
    	double value;
    }
    {
    	value = Primary()
    	(
    	  < MULTIPLY >
    	  i = Primary()
    	  { value *= i;}
    	| < DIVIDE >
    	  i = Primary()
    	  { value /= i;}
    	)*
    	{ return value;}
    }
    
    double Primary() throws NumberFormatException:
    {
    	Token t;
    	double d;
    }
    {
    	t = < NUMBER >
    	{ return Double.parseDouble(t.image); }
    |   < PREVIOUS >
    	{ return previousValue; }
    |   < OPEN_PAR> d = Expression() < CLOSE_PAR>
    	{ return d;}
    |   < MINUS > d = Primary()
    	{ return -d;}
    }
    

    学到了什么

    • 如何用正则表达式来进行词法分析从而得到Tokens,以及如何跳过无用的空白符
    • 如何利用JAVACC的action功能得到语义值
    • 捡起来了快忘记的markdown语法

    参考资料

    超好用的入门教程
    不知道说了些啥的官方文档

  • 相关阅读:
    Ubuntu 12.04 + nginx + php5 + phpfpm安装,并进行多站点配置
    PHP的FTP类
    php操作mongodb 分组排序
    mongodb 条件操作符
    PHP匿名登录FTP
    PHP连接到FTP服务器注意事项
    Java SE第二讲 原生数据类型Primitive Data Type
    java se 第五讲 运算符续
    Java SE 第一讲 入门jdk的下载安装
    Java SE第三讲:原生数据类型的使用陷阱
  • 原文地址:https://www.cnblogs.com/tclan126/p/9240667.html
Copyright © 2011-2022 走看看