函数应用程序的Antlr4语法

函数应用程序的Antlr4语法,antlr,antlr4,lambda-calculus,Antlr,Antlr4,Lambda Calculus,我正在尝试编写一个简单的lambda演算语法(如下所示)。我遇到的问题是,函数应用程序似乎被视为右关联而不是左关联,例如,“f1 2”被解析为(f(12))而不是((f1)2)。ANTLR有一个令牌的assoc选项,但我不认为这有什么帮助,因为函数应用程序没有操作符。有人看到解决办法了吗 LAMBDA : '\\'; DOT : '.'; OPEN_PAREN : '('; CLOSE_PAREN : ')'; fragment ID_START : [A-Za-z+\-*/_]; fragme

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

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;

谢谢

这打破了4.1的左递归模式匹配器。我想是在主分店打扫干净了。尝试下载最后一个主控和构建。目前,4.1生成:

expr[int\u p] :({}变量 |数 |功能定义 |打开\u盘expr关闭\u盘 ) ( {2>=$\u p}?expr )* ;


因为这条规则。循环中的expr ref实际上是expr[0],这是不对的。

在v4.2.2中,这个问题仍然存在。这里还有其他问题吗?我认为expr expr是问题所在。没有接线员。可能会造成问题。