私は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」をオプションにする方法について誰かが何かヒントを持っているなら、それは大いにありがたいです。