ユーザーが入力したテキストを検索エンジンスタイルで解釈する文法を作成しようとしています。AND、OR、NOT、およびANDNOTブール演算子をサポートします。私はほとんどすべてが機能していますが、引用符で囲まれた文字列の外側にある2つの隣接するキーワードが暗黙的にAND句のように扱われるというルールを追加したいと思います。例えば:
チーズとクラッカー=チーズとクラッカー
(上下)または(左右)=(上下)OR(左右)
猫の犬「ポットベリーピッグ」=猫と犬と「ポットベリーピッグ」</p>
私は最後のものに問題があり、誰かが私を正しい方向に向けることができることを望んでいます。これが私のこれまでの*.gファイルです。私のANTLRの経験は、1日未満です。
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!;