我正在尝试为 Jison 中的编程语言创建语法,但遇到了调用问题。我的语言中的函数使用以下语法调用:
functionName arg1 arg2 arg3
为了执行不仅仅是简单表达式的参数,它们需要用括号括起来,如下所示:
functionName (1 + 2) (3 + 3) (otherFunction 5)
但是,我的语法中有一个错误导致我的解析器解释functionName arg1 arg2 arg3
为functionName(arg1(arg2(arg3)))
而不是functionName(arg1, arg2, arg3)
.
我的 jison 语法文件的相关部分如下所示:
expr:
| constantExpr { $$ = $1; }
| binaryExpr { $$ = $1; }
| callExpr { $$ = $1; }
| tupleExpr { $$ = $1; }
| parenExpr { $$ = $1; }
| identExpr { $$ = $1; }
| blockExpr { $$ = $1; }
;
callArgs:
| callArgs expr { $$ = $1.concat($2); }
| expr { $$ = [$1]; }
;
callExpr:
| path callArgs { $$ = ast.Expr.Call($1, $2); }
;
identExpr:
| path { $$ = ast.Expr.Ident($1); }
;
我怎样才能让 Jison 更喜欢 thecallArgs
而不是expr
?