我試圖建立一個解釋用戶輸入的文本,搜索引擎式的語法。它將支持AND,OR,NOT和ANDNOT布爾運算符。我幾乎所有的工作,但我想添加一個規則,隱式引用的字符串之外的兩個相鄰的關鍵字被視爲在一個AND子句。例如:(左,右)ANTLR - 隱和令牌在樹
奶酪和餅乾=奶酪和餅乾
(上下),或=(上下)OR(左,右)
貓狗「大肚子豬」 =貓與狗‘大肚子豬’
我在與最後一個麻煩,我希望有人能指出我在正確的方向。這是我的* .G文件迄今爲止,並請很好,我ANTLR經驗涵蓋不到一天的工作:
grammar SearchEngine;
options { language = CSharp2; output = AST; }
@lexer::namespace { Demo.SearchEngine }
@parser::namespace { Demo.SearchEngine }
LPARENTHESIS : '(';
RPARENTHESIS : ')';
AND : ('A'|'a')('N'|'n')('D'|'d');
OR : ('O'|'o')('R'|'r');
ANDNOT : ('A'|'a')('N'|'n')('D'|'d')('N'|'n')('O'|'o')('T'|'t');
NOT : ('N'|'n')('O'|'o')('T'|'t');
fragment CHARACTER : ('a'..'z'|'A'..'Z'|'0'..'9');
fragment QUOTE : ('"');
fragment SPACE : (' '|'\n'|'\r'|'\t'|'\u000C');
WS : (SPACE) { $channel=HIDDEN; };
PHRASE : (QUOTE)(CHARACTER)+((SPACE)+(CHARACTER)+)+(QUOTE);
WORD : (CHARACTER)+;
startExpression : andExpression;
andExpression : andnotExpression (AND^ andnotExpression)*;
andnotExpression : orExpression (ANDNOT^ orExpression)*;
orExpression : notExpression (OR^ notExpression)*;
notExpression : (NOT^)? atomicExpression;
atomicExpression : PHRASE | WORD | LPARENTHESIS! andExpression RPARENTHESIS!;
謝謝!那就是訣竅。我的後續關注(現在已被刪除,以及您的編輯被指向)是由於某些封閉的C#代碼中的錯誤。 – user409108 2010-08-03 18:31:23
@highbeammeup,很高興聽到這一點。不客氣! – 2010-08-03 18:39:29
@BartKiers Iam理解你的重寫規則有問題,儘管我在這裏有參考。你能解釋爲什麼需要(..)(..)部分和美元操作員做什麼? – 2012-11-28 13:31:10