Resolver conflitos na gramática de bisonte com listas de expressão separadas por espaço + if / then / else
Tenho a seguinte gramática yacc / bison / happy:
%token
if TokenIf
then TokenThen
else TokenElse
true TokenTrue
false TokenFalse
%left APP
%right IF
%%
Hungry
: NoHungry
| Hungry NoHungry %prec APP
| if Hungry then Hungry else Hungry %prec IF
NoHungry
: true
| false
bison -v
diz-me que existem dois conflitos na seguinte situação:
State 12
2 Hungry: Hungry . NoHungry
3 | if Hungry then Hungry else Hungry .
true shift, and go to state 2
false shift, and go to state 3
true [reduce using rule 3 (Hungry)]
false [reduce using rule 3 (Hungry)]
$default reduce using rule 3 (Hungry)
NoHungry go to state 8
Tentei resolver o conflito dando uma declaração de precedência explícita com%prec
, mas sem sucesso. Dado que o bisonte resolve o conflito como desejado (por exemplo, muda em vez de reduzir), isso não é tão ruim, mas eu me pergunto como podemos nos livrar do conflito sem alterar o idioma aceito.