я беру первый удар при создании грамматики для выражений, как:ANTLR для булева/условного выражения
(foo = bar or (bar = "bar" and baz = 45.43)) and test = true
Моей грамматика до сих пор выглядит следующим образом:
grammar filter;
tokens {
TRUE = 'true';
FALSE = 'false';
AND = 'and';
OR = 'or';
LT = '<';
GT = '>';
EQ = '=';
NEQ = '!=';
PATHSEP = '/';
LBRACK = '[';
RBRACK = ']';
LPAREN = '(';
RPAREN = ')';
}
expression : or_expression EOF;
or_expression : and_expression (OR or_expression)*;
and_expression : term (AND term)*;
term : atom (operator atom)? | LPAREN expression RPAREN;
atom : ID | INT | FLOAT | STRING | TRUE | FALSE;
operator : LT | GT | EQ | NEQ;
INT : '0'..'9'+;
FLOAT : ('0'..'9')+ '.' ('0'..'9')*;
STRING : '"' ('a'..'z'|'A'..'Z'|'_'|' ')* '"';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
Но в ANTLRWorks 1.4.3, я получаю дерево разбора:
Но для литий Я не могу понять, что не так с моей грамматикой. Какой токен здесь отсутствует?
Большое спасибо заранее.
Редактировать: Чтобы уточнить альтернативу atom
, я должен, возможно, упомянуть, что атомы должны быть свободно стоящими без сравнения с другим атомом. Например. a or b
является допустимым выражением.
Space-символы, возможно? –