2015-03-31 162 views
0

我想有以下語法(的一部分):ANTLR與非貪婪規則

expression 
: 
expression 'AND' expression 
| expression 'OR' expression 
| StringSequence 
; 

StringSequence 
: 
StringCharacters 
; 

fragment 
StringCharacters 
: StringCharacter+ 
; 

fragment 
StringCharacter 
: ~["\] 
| EscapeSequence 
; 

應該匹配像「ABCDF」(不帶引號),以及像「的東西a AND b AND c「。

問題是我的規則StringSequence是貪婪的,並且消耗OR/AND。我嘗試過不同的方法,但無法讓我的語法以正確的方式工作。這可能與ANTLR4?請注意,我不想在每個字符串周圍加引號。

StringSequence : 
    (StringCharacter | NotAnd | NotOr)+ 
; 
fragment NotAnd : 
    'AN' ~'D' 
| 'A' ~'N' 
; 
fragment NotOr: 
    'O' ~('R') 
; 
fragment StringCharacter : 
    ~('O'|'A') 
; 

獲取更復雜一點與空白的規則:把引號,因爲該規則變得不貪婪,即:

StringSequence 
: '"' StringCharacters? '"' 
; 

回答

2

您沒有空格規則,因此StringCharacter匹配除引號和反斜槓字符(+轉義序列號)之外的所有內容。包含一個空格規則以使其匹配個別的AND/OR令牌。此外,我建議爲字符串文字定義詞法分析規則('AND','OR'),而不是將它們嵌入(解析器)規則中。通過這種方式,您不僅可以獲取令牌的名稱(而不是自動生成的名稱),還可以更好地控制匹配順序。

1

然而,一個天真的解決辦法正常工作。另一個解決方案是使用語義謂詞向前看,並防止關鍵字的讀取。