我一直在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解析字符串,如「羊狗魚」。
如果任何人有任何提示如何使我的「和」可選,它將不勝感激。
嗨特倫斯, 感謝您的答覆。但我想要「和」是可選的,下面的不起作用: andexpression:atom(AND_OP?^ atom) 這就是爲什麼我訴諸重寫規則的原因。 Allen – user108687
大鼠,現在特倫斯是在stackoverflow,祝你好運,試圖成爲任何ANTLR問題的選擇答案:) – chollida