野牛移位/减少与匿名函数调用的冲突

时间:2019-03-13 18:15:25

标签: bison anonymous-function shift-reduce-conflict

我的语言允许使用匿名函数声明,例如(x: int):int => { return x * x - x }。要调用它,只需编写(expression)。但是我还必须将表达式放在括号内以表示优先级,例如x*(y+z)

现在,野牛引发了具有单个参数的匿名函数调用的移位/减少冲突。

这是语法部分的一部分:

expr: ID %prec LOW
    | ID '=' expr %prec LOW
    | ID '(' ')'
    | ID '(' call_args ')'
    | '(' call_args ')' // anonymous function call
    | '(' ')'           // anonymous function call without arg
    | '(' expr ')'      // expression enclosed, like '(y+z)' in 'x*(y+z)'
    | expr op_arithematic expr %prec HIGH
    | expr op_comparison expr %prec HIGH 
    | numeric

call_args: expr
    | call_args ',' expr

有冲突的输出是:

State 31

   31 expr: '(' expr . ')'
   32     | expr . op_arithematic expr
   33     | expr . op_comparison expr
   37 call_args: expr .
    ...
    ...
    ...
    ')'  shift, and go to state 61

    ')'       [reduce using rule 37 (call_args)]
    $default  reduce using rule 37 (call_args)

我还添加了%prec,但没有运气:

expr: ID %prec LOW
    | ID '=' expr %prec LOW
    | ID '(' ')'
    | ID '(' call_args ')'
    | '(' call_args ')'  %prec HIGH // anonymous function call
    | '(' ')'                       // anonymous function call without arg
    | '(' expr ')'       %prec LOW  // expression enclosed, like '(y+z)' in 'x*(y+z)'
    | expr op_arithematic expr %prec HIGH
    | expr op_comparison expr %prec HIGH 
    | numeric

call_args: expr
    | call_args ',' expr

允许调用这样的匿名函数对我来说很痛苦,但是我无法避免实现它,因为这是我的实验室任务。我找不到解决此问题的方法。

0 个答案:

没有答案