Почти каждая ошибка сдвига / уменьшения с if/then/else
оператором является печально известной висячей еще проблемой.
С этим сегментом кода:
if (f1):
if (f2):
c1
else:
c2
вы (и Python из-за его причудливых правил отступа) знают, к чему if
принадлежит else
, но парсер не настолько умен.
Невозможно определить, принадлежит ли else
первому или второму if
.
Эта ссылка показывает, как преобразовать LR (n) в эквивалент LR (1), который должен решить проблему.
Другая альтернатива - изменить определение базового языка (если это возможно), чтобы устранить неопределенность:
: IF '(' cond ')' THEN statement ENDIF
| IF '(' cond ')' THEN statement ELSE statement ENDIF