利用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 : "\n" | "\r" | "\r\n"> }

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语法

参考资料

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

猜你喜欢

转载自www.cnblogs.com/tclan126/p/9240667.html
今日推荐