javacc简单计算器

/**
 * JavaCC file
 */
 
options {
  JDK_VERSION = "1.5";
}
PARSER_BEGIN(eg1)
package original;

public class eg1 {
  public static void main(String args[]) throws ParseException {
    eg1 parser = new eg1(System.in);
     parser.Start();
    }
    double value=0.0;
  }

PARSER_END(eg1)

SKIP :
{
 	" "
|	"\t"
}
TOKEN:
{
	 < EOL:
	    "\n"|"\r"|"\r\n"
	 >
}
TOKEN : /* OPERATORS */
{
	< PLUS: "+" >
	|<MINUS: "-" >
	|<TIMES: "*" >
	|<DIVIDE: "/" >
	|<LEFT: "(" >
	|<RIGHT:")" >
}
TOKEN:
{
	< NUMBER:<DIGITS>|<DIGITS>"."<DIGITS>|<DIGITS>"."|"."<DIGITS>>
	|< #DIGITS: (["0"-"9"])+ >
}
void Start()throws NumberFormatException:
{}
{
	(
  value= expression()
  <EOL>
  {System.out.println(value);}
  )*
  <EOF>
  
}
double expression() throws NumberFormatException:
{
	double i;
	double ivalue;
}
{
	ivalue=term()
	(
	  <PLUS>
	  i=term()
	  {
	  	 ivalue+=i;
	  }
	  |
	  <MINUS>
	   i=term()
	   {
	   	 ivalue-=i;
	   }
	)*
	{return ivalue;}
}
double term()throws NumberFormatException:
{
	double ivalue;
	double i;
}
{
	ivalue=primary()
	(
	  <TIMES>
	   i=primary()
	   { ivalue*=i;}
	   |<DIVIDE>
	   i=primary()
	   {ivalue/=i;}
	)*
	{return ivalue;}
}
double primary()throws NumberFormatException:
{
	Token t;
	double d;
}
{
	t=<NUMBER>
	{
		 return Double.parseDouble(t.image);
	}
	|
	<LEFT>d=expression()<RIGHT>
	{return d;}
	|
	<MINUS>
	 d=primary()
	 {
	 	return -d;
	 }
}


这编译原理确实是有些高深,如果不认真做,好像还真不怎么明白,上午弄了一上午,终于把这个计算器弄出来了,但是后面要做的还很多,不管怎样,还是先记录下吧。

我使用的bnf为:

Start->(expression EOL)*EOF;

expression->term(PLUS term|MINUS term)*;

term->primary(TIMES primary|DIVIDE primary);

primary->NUMBER|(expression)|-primary

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值