Antlr4 函数应用语法

标签 antlr antlr4 lambda-calculus

我正在尝试编写一个简单的 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 : [ \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 的左递归模式匹配器。我相信主分支已经清理干净了。尝试下载最后一个 master 并构建。当前 4.1 生成:

表达式[int _p] : ( {} 多变的 |数字 |函数定义 | OPEN_PAREN 表达式 CLOSE_PAREN ) ( {2 >= $_p}?表达式 )* ;

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

关于Antlr4 函数应用语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19623410/

相关文章:

antlr - 消除给定 ANTLR 语法中的额外空格

java - 使用 ANTLR 为 java 源代码生成抽象语法树

listener - ANTLR 4 : How get correct order arguments in Listeners

python - Lambda 而不是 "if"语句

lambda-calculus - 何时重命名 lambda 演算中的变量?

java - ANTLR:Unicode 字符扫描

antlr - 从 ParserRuleContext 检索 token 列表

clojure - 为 ANTLR 语法编写解释器

ant - 使用 ant : [java] error(7): cannot find or open file: *. g 从源代码构建 ANTLR v4 时出现问题

lambda-calculus - 教会数字加法