爲了使得計算器具有更多功能,咱們須要更多的操做符,好比減法、乘法和除法。接下來咱們添加減法運算。
在詞法分析器的描述部分,咱們添加以下生產式:java
TOKEN : { < MINUS : "-" > }
在詞法分析器的描述文件中,咱們層在定義EOL和NUMBER這兩個token時,使用豎線來表示「或」的意思,以此來區分不一樣的選項。在語法分析器的BNF生產式中,咱們也一樣用豎線來表示「或」的功能。
在這個例子中,咱們須要在PLUS和MINUS這兩個token之間作選擇。用BNF符號表達式來表示就以下所示:測試
Expression --> Primary ((PLUS | MINUS) Primary) *
可是咱們也能夠使用以下表示:3d
Expression --> Primary (PLUS Primary | MINUS Primary)*
這種方式使得生成的java代碼簡單些,在JavaCC描述文件中,其對應的生產式以下所示:code
double Expression() throws NumberFormatException : { double i ; double value ; } { value = Primary() ( <PLUS> i = Primary() { value += i ; } | <MINUS> i = Primary() { value -= i ; } )* { return value ; } }
通過上面的修改,修改以後完整的.jj文件內容以下所示:orm
/* 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 ) ; } }
編譯
blog
測試1+2:
token
測試 4-3:
io
測試6.6-4.:
編譯