解析语法:没有括号的函数调用VS表达式

时间:2015-10-30 20:24:34

标签: parsing context-free-grammar

我正在制作一种有趣的语言。我也想要没有括号的函数调用(比如在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(); } }

与野牛一起?

0 个答案:

没有答案