Похоже, что грамматика является прямой реализацией представления EBNF требуемого DSL.Требуется немного больше работы, чтобы заставить его хорошо работать в ANTLR.Как:
1) существует проблема взаимной рекурсии слева с правилами function_expr
, paramList
и param
;
2) sentence
ничего не может сравниться;
3) WS
скрыто в лексере, поэтому sentence
никогда не сможет совпадать;);
4) тени ID
правила WORD
, поэтому токены WORD
никогда не будут выбрасываться.
(Вы должны были получить предупреждение Tool на 1 и 2; никогда не игнорировать, так как предупреждения указывают, что поведение во время выполнения может быть затронуто.)
Основная форма для выраженияправило состоит в том, чтобы перечислить в одном правиле все альтернативные формы выражения.
expr : LPAREN expr RPAREN
| expr operator expr
| function
| string
| number
| ID
;
function : ID LPAREN ( ID | function ) (',' ( ID | function ))* RPAREN ;
string : STRING ;
number : INTEGER | FLOAT ;
operator : OPERATOR ;
STRING : '"' .*? '"' ;
(не проверено)
Таким образом, (a (c, d (e, f)) != b)
должно правильно вычисляться как
expr (function ( ID, function ( ID, ID ) ) operator ID