4

ユーザーが入力したテキストを検索エンジンスタイルで解釈する文法を作成しようとしています。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!;
4

1 に答える 1

6

ANDルールにはオプションのANDキーワードがあるため、架空のANDトークンを作成し、書き換えルールを使用してそのトークンをツリーに「挿入」する必要があります。この場合、ANTLRの短縮^ルート演算子を使用することはできません。->書き換え演算子を使用する必要があります。

次のandExpressionようになります。

andExpression
  :  (andnotExpression        -> andnotExpression)
     (AND? a=andnotExpression -> ^(AndNode $andExpression $a))* 
  ;

この(おそらく不可解な)表記法の詳細な説明は、TerenceParrによるTheDefinitive ANTLR Referenceの173〜174ページの第7章「サブルールのルールの書き換え」のセクションに記載されています。

andExpression簡単なテストを実行して、文法が新しいルールで適切なASTを生成するかどうかを確認しました。文字列を解析した後cat dog "potbelly and pig" and FOO、生成されたパーサーは次のASTを生成しました。

代替テキストhttp://img580.imageshack.us/img580/7370/andtree.png

AndNodeおよびRoot虚数のトークンであることに注意してください。

上記のAST画像を作成する方法を知りたい場合は、次のスレッドを参照してください:ANTLRで作成されたASTの視覚化(.Net環境で)

編集

との両方を解析するone two three(one two) three、次のASTが作成されます。

代替テキストhttp://img203.imageshack.us/img203/2558/69551879.png

そして、解析(one two) OR threeすると、次のASTが作成されます。

代替テキストhttp://img340.imageshack.us/img340/8779/73390353.png

これはすべての場合に適切な方法のようです。

于 2010-08-03T12:40:51.987 に答える