2012-05-15 38 views
1

我正在使用JavaCC爲簡單語言的解析器工作。定義令牌的「羣組」

在我的令牌聲明部分,我有這樣的事情

< CONSTANT: <INTEGER> | <FLOAT_NUMBER> | <BOOLEAN> > 

< INTEGER: "0" | ("-")? ["1"-"9"](["0"-"9"])* | "0x" (["0"-"9"] | ["a"-"f"] | ["A"-"F"])+ > 
< FLOAT_NUMBER: ("-")? (["0"-"9"])+ "." (["0"-"9"])+ ("E" ("-")? (["0"-"9"])+)? ("D")? > 
< BOOLEAN: "true" | "false"> 

CONSTANT,由於其訂單,比INTEGER更高的優先級。但是,有些語法的部分地方我特別需要INTEGER。在這些情況下,解析器會拋出異常,因爲INTEGER被解析爲CONSTANT

一個簡單的解決方案是消除CONSTANT令牌並找到並替換它爲(<INTEGER> | <FLOAT_NUMBER> | <BOOLEAN>)。雖然這感覺相當笨拙。

有沒有辦法將CONSTANT簡單地定義爲其他標記的分組,這樣CONSTANT本身不是標記,而是(<INTEGER> | <FLOAT_NUMBER> | <BOOLEAN>)的簡寫?

謝謝你的時間。

回答

2

我認爲這裏的簡單答案是,你不應該在標記器中這樣做。

這是更好地投入生產規則這個功能,比如:

Token parseConstant() : 
{ 
    Token t;  
} 

{ 
    (
     t = <INTEGER> | t = <FLOAT_NUMBER> | t = <BOOLEAN> 
    ) 
    { 
     return t; 
    } 

} 
+0

同意,謝謝。 –