Я пытаюсь разобрать язык с помощью ANTLR, который может содержать следующий синтаксис:
someVariable, somVariable.someMember, functionCall(param).someMember, foo.bar.baz(bjork).buffalo().xyzzy
Это грамматика ANTLR, которую я придумал до сих пор, и access_operation
выдает ошибку
Следующие наборы правил взаимно рекурсивны [access_operation, выражение]
:
grammar Test;
options {
output=AST;
ASTLabelType=CommonTree;
}
tokens {
LHS;
RHS;
CALL;
PARAMS;
}
start
: body? EOF
;
body
: expression (',' expression)*
;
expression
: function -> ^(CALL)
| access_operation
| atom
;
access_operation
: (expression -> ^(LHS)) '.'! (expression -> ^(RHS))
;
function
: (IDENT '(' body? ')') -> ^(IDENT PARAMS?)
;
atom
: IDENT
| NUMBER
;
fragment LETTER : ('a'..'z' | 'A'..'Z');
fragment DIGIT : '0'..'9';
IDENT : (LETTER)+ ;
NUMBER : (DIGIT)+ ;
SPACE : (' ' | '\t' | '\r' | '\n') { $channel=HIDDEN; };
То, что мне удалось, так это рефакторинг access_operation
правилу '.' выражение
, которое генерирует AST, в котором узел access_operation
содержит только правую часть операции.
Вместо этого я ищу что-то вроде этого:
Как можно решить проблему левой рекурсии в этом случае?