Antlr4 函数应用的语法



我正在尝试编写一个简单的lambda演算语法(如下所示)。我遇到的问题是函数应用程序似乎被视为右关联而不是左关联,例如"f 1 2"被解析为 (f (1 2)) 而不是 ((f 1) 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 : [ trn]+ -> 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 _p] : ( {} 变量 |数 |function_def |OPEN_PAREN expr CLOSE_PAREN ) ( {2>= $_p}?埃克普尔 )* ;

循环中的 expr ref 实际上是 expr[0],这是不对的。

相关内容

  • 没有找到相关文章

最新更新