例4:計算器--添加減法運算
1. calculator1.jj
為了使得計算器具備更多功能,我們需要更多的操作符,比如減法、乘法和除法。接下來我們添加減法運算。
在詞法分析器的描述部分,我們添加如下生產式:
TOKEN : { < MINUS : "-" > }
在詞法分析器的描述文件中,我們層在定義EOL和NUMBER這兩個token時,使用豎線來表示“或”的意思,以此來區分不同的選項。在語法分析器的BNF生產式中,我們也同樣用豎線來表示“或”的功能。
在這個例子中,我們需要在PLUS和MINUS這兩個token之間做選擇。用BNF符號表達式來表示就如下所示:
Expression --> Primary ((PLUS | MINUS) Primary) *
但是我們也可以使用如下表示:
Expression --> Primary (PLUS Primary | MINUS Primary)*
這種方式使得生成的java代碼簡單些,在JavaCC描述文件中,其對應的生產式如下所示:
double Expression() throws NumberFormatException :
{
double i ;
double value ;
}
{
value = Primary()
(
<PLUS>
i = Primary()
{ value += i ; }
| <MINUS>
i = Primary()
{ value -= i ; }
)*
{ return value ; }
}
2.測試
經過上面的修改,修改之后完整的.jj文件內容如下所示:
/* calculator0.jj An interactive calculator. */
options {
STATIC = false ;
}
PARSER_BEGIN(Calculator)
import java.io.PrintStream ;
class Calculator {
public static void main( String[] args )
throws ParseException, TokenMgrError, NumberFormatException {
Calculator parser = new Calculator( System.in ) ;
parser.Start( System.out ) ;
}
double previousValue = 0.0 ;
}
PARSER_END(Calculator)
SKIP : { " " }
TOKEN : { < EOL : "\n" | "\r" | "\r\n" > }
TOKEN : { < PLUS : "+" > }
TOKEN : { < MINUS : "-" > }
TOKEN : { < NUMBER : <DIGITS>
| <DIGITS> "." <DIGITS>
| <DIGITS> "."
| "."<DIGITS> >
}
TOKEN : { < #DIGITS : (["0"-"9"])+ > }
void Start(PrintStream printStream) throws NumberFormatException :
{}
{
(
previousValue = Expression()
<EOL> { printStream.println( previousValue ) ; }
)*
<EOF>
}
double Expression() throws NumberFormatException :
{
double i ;
double value ;
}
{
value = Primary()
(
<PLUS>
i = Primary()
{ value += i ; }
| <MINUS>
i = Primary()
{ value -= i ; }
)*
{ return value ; }
}
double Primary() throws NumberFormatException :
{
Token t ;
}
{
t = <NUMBER>
{ return Double.parseDouble( t.image ) ; }
}
編譯
測試1+2:
測試 4-3:
測試6.6-4.: