2013-03-18 49 views
1

我有一種語法,我無法區分可能屬於布爾值或字符串的值的歧義。使用含糊不清的字符串值解析ANTLR4規則

該語法有幾個字段類型字符串和布爾類型。一個String字段幾乎可以包含引號內的任何內容,而一個布爾值可以包含「Y」或「N」。問題:有時一個String字段也可以包含「Y」或「N」(通常作爲多個單字符值列表的一部分)。

以下是相關的語法規則。我試過用一個謂詞來消除布爾比較的字符串,只要該字符串是「Y」或「N」。

booleanLogical 
: booleanAtom (EQ|NE) booleanAtom 
| booleanAtom (EQ|NE) {_input.LT(1).getText().equals("\"Y\"") || _input.LT(1).getText().equals("\"N\"")}? STRING 
; 

booleanAtom 
: BOOLEAN_FIELD 
; 

stringLogical 
: stringAtom (EQ|NE|LT|LE|GT|GE) stringAtom 
| STRING_FIELD (EQ|NE|LT|LE|GT|GE) ('"Y"'|'"N"') 
; 

stringAtom 
: STRING_FIELD 
| STRING 
; 

BOOLEAN_FIELD: ("BFIELD1","BFIELD2","BFIELD3"); 
STRING_FIELD: ("SFIELD1","SFIELD2","SFIELD3"); 

試圖解析布爾表達式時的錯誤消息:

BFIELD1="Y" 

是:

line 1:7: no viable alterative at input 'BFIELD1="Y"' 

在antlr3,我會只用一個超前,但是這不再是一個選項。

那裏有任何幫助嗎?

回答

3

由於在stringLogical規則中使用了文字'"Y"',所以輸入"Y"正在生成不是STRING的特殊令牌。我建議你不要試圖在解析器中區分"Y","N"和其他字符串,而是在解析完成後使用偵聽器來驗證字符串。

booleanLogical 
    : booleanAtom (EQ|NE) booleanAtom 
    | booleanAtom (EQ|NE) STRING 
    ; 

此外,重要的是要注意,ANTLR 4只評估出現在決策左邊緣的謂詞。您在原始booleanLogical規則中使用的謂詞不在決策的左邊緣,因此決不會評估它。