9.JavaCC官方入門指南-例4

例4:計算器--添加減法運算

1. calculator1.jj

  爲了使得計算器具有更多功能,咱們須要更多的操做符,好比減法、乘法和除法。接下來咱們添加減法運算。
  在詞法分析器的描述部分,咱們添加以下生產式: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 ; }
}

2.測試

  通過上面的修改,修改以後完整的.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.:
編譯

相關文章
相關標籤/搜索