2013-10-27 109 views
1

我在寫一個簡單的lambda微積分語法(如下所示)。我遇到的問題是,函數應用程序似乎被視爲正確的聯想而不是左聯想,例如, (f(1 2))而不是(f 1)2,將「f 1 2」解析爲(f(1 2))。 ANTLR有一個關於令牌的assoc選項,但我不明白這有什麼用處,因爲沒有函數應用的操作符。有沒有人看到解決方案?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 loop實際上是expr [0],這是不正確的。

+0

這個問題在v4.2.2中仍然存在。這裏還有其他問題嗎? –

+0

我認爲expr expr是個問題。沒有操作員。也許會造成一個問題。 –