我正在尝试编写一个简单的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;
谢谢!
答案 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],这是不对的。