/**
* 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