2014-04-10 5 views
3

저는 부끄러워합니다. int에서 bool로, 그리고 그 반대로 형식 변환을 사용하여 언어 문법을 작성했습니다.ANTLR4 또 다른 왼쪽 재귀

logic_expr : expr NOT? OR | AND expr 
     | expr '|' expr SMALLER | LARGER 
     | NUMBER 
     | NUMBER_SHORT 
     | IDENT 
     | LOGIC_DEFINED 
     ; 
math_expr : expr ADD | SUB expr 
     | NUMBER 
     | NUMBER_SHORT 
     | IDENT 
     | LOGIC_FULL 
     ; 
expr : logic_expr 
    | math_expr 
    | IDENT 
    | LOGIC_DEFINED 
    | '(' expr ')' 
    ; 

그러나 나를 ANTLR 말한다 "규칙의 다음 세트는 상호 왼쪽 재귀된다 [EXPR, math_expr logic_expr을]" 내가 내 문법의 잘못을 이해하지 못할?

+0

아마도 도움이 될 것입니다. http://www.youtube.com/watch?v=8JdjkshB7FI – ZhekaKozlov

답변

4

ANTLR 4.2.2에서 ANTLR 4는 현재 간접적 인 왼쪽 재귀를 포함하는 문법을 지원하지 않습니다. 이 제한은 issue #522에 의해 처리되며 ANTLR 4.3으로 만들 수 있기를 희망합니다. ANTLR 4 이후

은 이미 당신이 당신의 logic_exprmath_expr 규칙을 인라인으로이 문제를 해결할 수 직접 왼쪽 재귀를 지원합니다. 당신이 생략 한 괄호를 추가하여 3 개의 부러진 대안을 편집했습니다. 원래 규칙에 있던 모호성을 제거하지 않았습니다.

expr 
     : expr NOT? (OR | AND) expr 
     | expr '|' expr (SMALLER | LARGER) 
     | NUMBER 
     | NUMBER_SHORT 
     | IDENT 
     | LOGIC_DEFINED 
     | expr (ADD | SUB) expr 
     | NUMBER 
     | NUMBER_SHORT 
     | IDENT 
     | LOGIC_FULL 
     | IDENT 
     | LOGIC_DEFINED 
     | '(' expr ')' 
     ;