我正在制作一种有趣的语言。我也想要没有括号的函数调用(比如在ruby中),所以它们只是可选的。所以语法看起来像是:
expression:
... other expressions
| <a function call with parentheses>
| IDENTIFIER expression_list -> function call without parentheses
;
expression_list:
expression_list COMMA expression
| expression
;
我的问题是我当然有变量和表达式,如加法,一元等。如果我有这个:
x - y
这可能意味着函数调用x带参数-y或简单减法。
我希望这是一个减法。如果没有其他可能性,我只希望这是一个函数调用,例如:
x y
之间没有运算符,所以这只能是一个函数调用。
有没有其他方法可以解决这个问题,但在解析时跟踪符号?我只是没有看到任何基于纯语法修改的解决方案。如果没有一个只有语法的解决方案,那我怎么能丢弃一条规则并告诉bison与另一条规则相匹配呢?
我顺便使用bison作为我的解析器生成器。
编辑:我的终端优先级:
%left COMMA
.....
%left PLUS MINUS
... others, like multiply
%left LPAR RPAR
编辑2:
所以我意识到了所有的问题。我需要以某种方式回溯。我怎么能这样做:
IDENT exp_list { if ($1 is not defined) { back_and_choose_another_rule(); } }
与野牛一起?