2013-10-27 2 views
1

간단한 람다 계산법 문법 (아래 참조)을 작성하려고합니다. 내가 겪고있는 문제는 함수 응용 프로그램이 왼쪽 연관 대신 오른쪽 연관으로 취급되는 것입니다. "f 1 2"는 ((f 1) 2) 대신 (f (1 2))로 구문 분석됩니다. ANTLR에는 토큰에 대한 assoc 옵션이 있지만 함수 적용을위한 연산자가 없기 때문에 ANTLR이 여기서 도움이되는 방법을 알지 못합니다. 누구나 솔루션을 볼 수 있습니까?함수 적용을위한 Antlr4 문법

LAMBDA : '\\'; 
DOT : '.'; 
OPEN_PAREN : '('; 
CLOSE_PAREN : ')'; 
fragment ID_START : [A-Za-z+\-*/_]; 
fragment ID_BODY : ID_START | DIGIT; 
fragment DIGIT : [0-9]; 
ID : ID_START ID_BODY*; 
NUMBER : DIGIT+ (DOT DIGIT+)?; 
WS : [ \t\r\n]+ -> skip; 

parse : expr EOF; 

expr : variable      #VariableExpr 
    | number      #ConstantExpr 
    | function_def     #FunctionDefinition 
    | expr expr     #FunctionApplication 
    | OPEN_PAREN expr CLOSE_PAREN #ParenExpr 
; 
function_def : LAMBDA ID DOT expr; 
number : NUMBER; 
variable : ID; 

고마워요!

답변

1

이 경우 왼쪽 재귀를위한 4.1의 패턴 매처가 손상됩니다. 나는 믿는다. 마지막 마스터 및 빌드를 다운로드 해보십시오. 현재 4.1 생성

EXPR [INT _p] ({} 변수 | 번호 | function_def | OPEN_PAREN EXPR CLOSE_PAREN ) (? {2> = $ _p} EXPR ) * ;

해당 규칙을 따르십시오. expr ref in 루프는 실제로 expr [0]이며, 이는 올바르지 않습니다.

+0

이 문제는 v4.2.2에서도 여전히 발생합니다. 다른 문제가 있습니까? –

+0

나는 expr expr이 문제라고 생각한다. 운영자가 없습니다. 어쩌면 문제가 생길 수 있습니다. –