Javacc的例子

jeffersap發表於2007-08-28

[@more@]

PARSER_BEGIN(Simple1)
public class Simple1 {
public static void main(String args[]) throws ParseException {
Simple1 parser = new Simple1(System.in);
parser.Input();
}
}
PARSER_END(Simple1)

void Input() :
{}
{
MatchedBraces() (" "|" ")*
}
void MatchedBraces() :
{}
{
"{" [ MatchedBraces() ] "}"
}

設定好javacc的bin目錄後,在命令提示符下輸入javacc Simple1.jj 然後javacc就會為你生成下面幾個java原始碼檔案
Simple1.java
Simple1TokenManager.java
Simple1Constants.java
SimpleCharStream.java
Token.java
TokenMgrError.java

其中Simple1就是你的語法分析器的物件,它的建構函式引數就是要分析的輸入流,這裡的是System.in。 class Simple1就定義在標記PARSER_BEGIN(Simple1)和PARSER_END(Simple1)之間。但是必須清楚的是,PARSER_BEGIN和PARSER_END中的名字必須是詞法分析器的名字(這裡是Simple1)。
PARSER_END下面的定義就是文法非終結符號的定義了。
Simple1的文法基本就是:

Input -> MatchedBraces (" "|" ")*
MatchedBraces -> “{“ MatchedBraces “}”

從它的定義我們可以看到,每個非終結符號對於一個過程。比如Input的過程

void Input() :
{}
{
MatchedBraces() (" "|" ")*
}

在定義void Input後面記住需要加上一個冒號“:”,然後接下來是兩個塊{}的定義。
第一個{}中的程式碼是定義資料,初試化資料的程式碼。第二個{}中的部分就是真正定義Input的產生式了。
每個產生式之間用”|”符號連線。
注意:這裡的產生式並非需要嚴格BNF正規化文法,它的文法既可以是BNF,同時還可以是混合了正規表示式中的定義方法。比如上面的 Input -> MatchedBraces (" "|" ")*
中(“ ”|” ”)* 就是個正規表示式,表示的是 或者 的0個到無限個的重複的記號。而是javacc系統定義的記號(TOKEN),表示檔案結束符號。
除了,無論是系統定義的TOKEN,還是自定義的TOKEN, 裡面的TOKEN都是以的方式表示。

每個非終結符號(Input和MatchedBraces)都會在javacc生成的Simple1.java中形成Class Simple1的成員函式。當你在外部呼叫Simple1的Input,那麼語法分析器就會開始進行語法分析了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10230672/viewspace-966505/,如需轉載,請註明出處,否則將追究法律責任。

相關文章