2014-10-31 47 views
0

所以我SQL表達式編輯器下面的語法規則(簡體)Antlr4語法歧義:兩個相同的前綴規則

FUNCTIONID: 'sum' | 'avg'; 
functionExpr: FUNCTIONID '(' expr ')' 

AGGFUNCTIONID: 'sum' | 'avg' 
aggFunctionExpr: AGGFUNCTIONID '(' expr ')' 'over' ... 

的代碼適用於諸如「總和(1)在... 「但沒有時沒有over

我怎麼能讓這個語法適用於這兩種情況,仍然有這兩個規則?

+0

ANTLR4的詞法分析器工作在許多方面一樣ANTLR3,這是在這裏解釋:http://stackoverflow.com/questions/9251048/antlr-v3-error-with-parser-lexer-rules – 2014-10-31 07:47:27

+0

問題在於他們評論了第一條規則獲勝,這正是現在正在發生的事情。我希望解析器做的是預測一個'over'令牌,並根據是否有一個令牌來決定。那可能嗎? – escanda 2014-10-31 08:27:20

+0

不,這就是我的意思:ANTLR4和ANTLR3在這方面的工作原理是一樣的。我會在一個答案中進一步解釋。 – 2014-10-31 08:39:39

回答

0

'sum'和'avg'將永遠被標記爲FUNCTIONID,這是無法繞過它的。有關說明,請參見:Antlr v3 error with parser/lexer rules

你可以做這樣的事情:

aggFunctionExpr 
: aggFunctionId '(' expr ')' 'over' ... 
; 

functionExpr 
: functionId '(' expr ')' 
; 

functionId : SUM | AVG; 
aggFunctionId : SUM | AVG; 

SUM : 'sum'; 
AVG : 'avg'; 

... 
+0

你給了我一個正確的提示,把它作爲一個函數調用進行標記,並有一個可選的表達式,用於'over'和後面的內容。謝謝 – escanda 2014-10-31 09:56:27

+0

不客氣@escanda。 – 2014-10-31 10:05:38