Я новичок в лексере и парсере, поэтому наберитесь терпения. В конце концов я хочу иметь возможность выражать строки запросов в стиле LDAP, например, '(foo = bar)', '(! foo = bar)', '(& (foo = bar) (! zip = zap))' и в конце есть дерево, которое я мог бы использовать для создания фактического запроса к базе данных (или что угодно)
Поэтому я подумал начать с самой простой формы, чтобы разобрать выражения вроде (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');