2009-11-15 26 views
0

我一直在ANTLR(C#)中構建一個類似google的查詢語法分析器。在使用Antlr的查詢語法中隱含「and」的問題

我完成了一件事,除了一件事,我一直在努力並且未能解決。

如果用戶輸入「word1 word2 word3」,我希望解析器將其視爲與「word1 and word2 and word3」相同。所以實際上,「和」在術語之間是可選/隱含的。

我需要「和」來形成AST子樹的根,如果「and」實際上不存在,那麼它不會很好。即使在前瞻/回溯的情況下,我也無法找到正確的語法來使其發揮作用。

這裏是我當前的語法的一個片段,有一個明確的「和」的工作原理:

expression 
    : andexpression (OR_OP^ andexpression)* 
    ; 

andexpression 
options { 
backtrack=true; 
} 
    : atom (AND_OP^ atom)* 
    ; 

理想情況下,我想作andexpression看起來像這樣:

andexpression 
options { 
backtrack=true; 
} 
    : l=atom (AND_OP? r=atom)* -> ^(AND_OP $l $r?)+ 
    ; 

,但我得到RewriteEmptyStreamException解析字符串,如「羊狗魚」。

如果任何人有任何提示如何使我的「和」可選,它將不勝感激。

回答

1

答案由ANTLR郵件列表中的某人提供。奇蹟般有效。在這裏重新張貼有興趣的人。

expression 
    : l=andexpression (OR_OP^ r=andexpression)* 
    ; 

andexpression 
    : atom (andop^ atom)* 
    ; 

andop 
    : AND_OP -> AND_OP 
    | -> AND_OP 
    ; 
1

最好的辦法是這樣做:

andexpression:atom(AND_OP^atom);

回溯選項也是不必要的。

Terence

+0

嗨特倫斯, 感謝您的答覆。但我想要「和」是可選的,下面的不起作用: andexpression:atom(AND_OP?^ atom) 這就是爲什麼我訴諸重寫規則的原因。 Allen – user108687

+0

大鼠,現在特倫斯是在stackoverflow,祝你好運,試圖成爲任何ANTLR問題的選擇答案:) – chollida