功能应用的Antlr4语法

时间:2013-10-27 20:52:47

标签: antlr antlr4 lambda-calculus

我正在尝试编写一个简单的lambda演算语法(如下所示)。我遇到的问题是函数应用程序似乎被视为右关联而不是左关联,例如“f 1 2”被解析为(f(1 2))而不是((f 1)2)。 ANTLR有令牌的关联选项,但由于没有函数应用程序的操作符,因此我看不出这有何帮助。有没有人看到解决方案?

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 个答案:

答案 0 :(得分:1)

这打破了4.1的左递归模式匹配器。我相信在主要分支清理了。尝试下载最后一个主和构建。 CUrrently 4.1生成:

expr [int _p]      :({}变量         |数         | function_def         | OPEN_PAREN expr CLOSE_PAREN         )         (           {2> = $ _p}? EXPR         )*      ;

适用于该规则。 expr ref in loop实际上是expr [0],这是不对的。