0

私はANTLR(C#)でグーグルのようなクエリ構文パーサーを構築してきました。

長い間苦労して解決できなかった一つのことを除いて、私は終わりました。

ユーザーが「word1word2word3」と入力した場合、パーサーはこれを「word1とword2とword3」と同じように処理します。したがって、事実上、「and」はオプション/用語間の暗黙的です。

ASTサブツリーのルートを形成するために「and」が必要ですが、「and」が実際に存在しない場合はうまくいきません。先読み/後戻りがあっても、それを機能させるための正しい構文を見つけることができません。

これは、明示的な「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が発生します。

私の「and」をオプションにする方法について誰かが何かヒントを持っているなら、それは大いにありがたいです。

4

2 に答える 2

1

回答は、ANTLR メーリング リストの誰かから提供されました。魅力のように機能します。興味のある人のためにここに再投稿します。

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

andexpression
    : atom (andop^ atom)*
    ;

andop
    : AND_OP -> AND_OP
    | -> AND_OP
    ;
于 2009-11-17T12:23:37.910 に答える
1

最善の方法はこれを行うことです:

andexpression : アトム (AND_OP^ アトム) ;

バックトラックオプションも不要です。

テレンス

于 2009-11-15T18:22:49.007 に答える