Мой язык допускает объявление анонимных функций, например (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
Мне больно разрешать вызывать анонимную функцию, подобную этой, но я не могу избежать ее реализации, потому что это мое лабораторное задание. Я не нашел способа решить эту проблему.