日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java加法器_javacc例子:加法器

發布時間:2024/4/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java加法器_javacc例子:加法器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.2第一個例子:加法器

作為第一個例子,我們把以下的一些數相加:

99 + 42 + 0 + 15

除了阿拉伯數字之間外,所有的地方都可以有空格和換行,剩余的字符必須是10進制數或加號”+”。

這段示例代碼是”adder.jj”文件的一部分,adder.jj包含JavaCC規則的詞法分析和語法分析代碼,它處理上面的加法算式。

1.2.1選項和類聲明

文件的第一部分是:

/* adder.jj

Adding up numbers */

options {

STATIC = false ;

}

PARSER

BEGIN(Adder)

class Adder {

static void main( String[] args )

throws ParseException, TokenMgrError {

Adder parser = new Adder( System.in ) ;

parser.Start() ;

}

}

PARSER

END(Adder)

在開頭的注釋之后,是選項部分,本例除了STATIC選項把默認值true改為false外,其它的都是使用的JavaCC的選項默認值,關于選項更多的信息可以參考JavaCC文檔,本書的后續部分或者FAQ。接下來是一個稱為Adder的Java類,這里看到的不是完整的Adder類,JavaCC會在生成Java代碼的過程中添加該類的聲明。這個main方法會拋出ParseException和TokenMgrError這兩個異常,JavaCC會自動生成這兩個異常類。

1.2.2指定一個詞法分析器

在返回到這個main方法前,先看看詞法分析規則。在這個簡單的例子中,詞法限定在如下的四行中:

SKIP : { ” ” }

SKIP : { ”\n” |

”\r” | ”\r\n” }

TOKEN : { <

PLUS : ”+” > }

TOKEN : { <

NUMBER : ([”0”-”9”])+ > }

第一行是說空格雖然是標識符,但要跳過,就是說,不傳給語法分析器。第二行是換行,和空格一樣處理。不同的操作系統的換行符是不一樣的,在Unix和Linux系統中使用”\n”,在DOS和Windows下使用”\r\n”,在老的Macintoshes系統(Darwine內核之前,新的Macintoshes系統采用的是Unix方式的換行。譯者注)中使用的是單一的”\r”。我們告訴JavaCC所有的這些可能,使用一個垂線”|”來分開它們。第三行告訴JavaCC加號是一個標識符,用PLUS符號表示。最后是第四行,告訴JavaCC數字的語法,用NUMBER符號表示這一類型的標識符。如果你對Perl或者Java的正則表達式包熟悉的話,就容易看懂前面的NUMBER符號了。我們看看正則表達式([”0”-”9”])+,[”0”-”9”]表示任意阿拉伯數字,就是說,是0和9之間的任何unicode字符。形如(x)+的正則式匹配一個或者多個字符串,其中每個字符串又匹配正則式x。所以([”0”-”9”])+匹配一個或多個阿拉伯數字組成的任意序列。這四行都被稱為正則表達產生式。

還有一種標識符,被稱為EOF,代表輸入序列的結束,沒必要用正則表達式產生EOF,JavaCC自動把文件的末尾作為EOF。

考慮包含如下字符的一個輸入文件:

“123 + 456\n”

詞法分析器找到7個標識符:NUMBER,空格,加號,空格,NUMBER,新行,EOF。被標記為SKIP的正則產生式不傳給語法分析器,所以語法分析器得到的是:

NUMBER, PLUS, NUMBER, EOF

假設不是合法的輸入文件,包含未知的字符,比如:

“123 - 456\n”

在發現第一個空格后,詞法分析器會找到一個減號。由于沒有減號這個標識符,詞法分析器會拋出一個TokenMgrError異常。

如果是下面這個字符序列呢?

“123 ++ 456\n”

這次詞法分析也可以把這個序列解析為如下的標識符:

NUMBER, PLUS, PLUS, NUMBER, EOF

詞法分析器判斷不出這個標識符序列是否正確,會把這些交給語法分析器。語法分析器會在詞法分析器傳送過來第二個PLUS符號時發現一個錯誤,那么,它就不再繼續處理剩余的部分了。所以實際傳送給語法分析器標識符序列是:

NUMBER, PLUS, PLUS

跳過一個字符或字符序列并不等同于忽略它。考慮一個輸入序列:

“123 456\n”

詞法分析識別出三個標識符:兩個NUMBER和中間的一個空格,語法分析器會再次報錯。

1.2.3指定一個語法分析器

JavaCC語法規范由NBF產生式構成,看起來有些象Java方法定義。

void Start() :

{}

{

(

)*

}

BNF產生式定義合法的標識符序列,本例中,序列由NUMBER符號開頭,以EOF結尾,中間包含0個或多個子序列,這個子序列為PLUS符號后面緊跟一個NUMBER標識符。

前面說的語法分析器只檢查輸入序列是否含有錯誤,并不真正的計算數的加法。接下來我們修改這個語法分析器來修正這一點。首先,生成Java代碼并運行看看。

1.2.4生成詞法分析器與語法分析器

前面已經構造了adder.jj文件,下面用JavaCC來處理它。怎樣處理其實是依賴于不同的操作系統的。在Windows NT,2000,XP下面,用“命令提示符”程序(CMD.exe)來運行JavaCC:

D:\home\JavaCC-Book\adder>javacc

adder.jj

Java Compiler

Compiler Version 2.1 (Parser Generator)

Copyright (c)

1996-2001 Sun Microsystems, Inc.

Copyright (c)

1997-2001 WebGain, Inc.

(type

"javacc" with no arguments for help)

Reading from

file adder.jj . . .

File

"TokenMgrError.java" does not exist. Will create one.

File

"ParseException.java" does not exist. Will create one.

File

"Token.java" does not exist. Will create one.

File

"SimpleCharStream.java" does not exist. Will create one.

Parser

generated successfully.

會產生7個Java類,每個都在自身的文件中:

?TokenMgrError一個簡單的錯誤定義類,用于詞法分析中遇到的錯誤,是Throwable的子類。

?ParseException另一個錯誤定義類,用于語法分析中遇到的錯誤,是Exception進而是Throwable的子類。

?Token標識符定義類。每個標識符都用一個整型的變量kind和一個字符串類型的變臉image,kind表示標識符(PLUS,NUMBER后者EOF)的類型,image是標識符表示的字符序列。

?SimpleCharStream適配器類,把字符串傳給詞法分析器。

?AdderConstants定義了詞法分析和句法分析用到的一些類的接口。

?AdderTokenManager詞法分析器。

?Adder is the parser語法分析器。

現在可以用Java編譯器來編譯這些類了:

D:\home\JavaCC-Book\adder>javac

*.java

注意:本blog中含源代碼的文章推薦使用firefox閱讀,可以獲得較佳的效果。

總結

以上是生活随笔為你收集整理的java加法器_javacc例子:加法器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。