私はレクサーとパーサーの初心者なので、しばらくお待ちください。最終的には、'(foo=bar)'、'(!foo=bar)'、'(&(foo=bar)(!zip=zap))' などの LDAP スタイルのクエリ文字列を表現できるようにしたいと考えています。最後に、実際のデータベースクエリ(または何でも)を作成するために使用できるツリー
そこで、(foo=bar) や (!foo=bar) のような式を解析するための最も単純な形式から始めようと考えましたが、すでにいくつかの理解の問題があります。フィールドが「=」によって値と区切られていることを表現したいだけですが、識別子が値によく似ているため、ANTLR は一度にすべての文字を食べているようです。これを防ぐにはどうすればよいですか?
grammar FilterExpression;
options
{
language=Java;
k=2;
}
tokens
{
NOT='!';
}
term : '(' NOT? FIELD '=' VALUE ')';
// lexer
FIELD : NAME;
VALUE : CDATA;
fragment NAME
: ALPHA+;
fragment CDATA
: ALPHA*;
fragment ALPHA
: ('a'..'z' | 'A'..'Z');