我的语言允许使用匿名函数声明,例如(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
允许调用这样的匿名函数对我来说很痛苦,但是我无法避免实现它,因为这是我的实验室任务。我找不到解决此问题的方法。