利用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语法
参考资料
Yosoro