Решение левой рекурсии в antlr

Я пытаюсь разобрать язык с помощью 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 содержит только правую часть операции.

Вместо этого я ищу что-то вроде этого:

enter image description here

Как можно решить проблему левой рекурсии в этом случае?

5
задан pulse00 2 January 2012 в 15:39
поделиться