Bison Flex уменьшает / уменьшает конфликт при болтовне в середине действия - PullRequest
0 голосов
/ 23 апреля 2020

В настоящее время я перевожу свой веселый проект в bison / flex в качестве парсера, и у меня возникают проблемы с разрешением конфликта уменьшения / уменьшения:

// https://github.com/X39/yaoosl/blob/master/code-gen/yaoosl.y#L761-L766
ifthen: YST_IF YST_ROUNDO expression code_ifstart YST_ROUNDC codebody code_ifendnoelse
        | YST_IF YST_ROUNDO expression code_ifstart YST_ROUNDC ifthen_clsd YST_ELSE code_ifelse ifthen code_ifendelse
        ;
ifthen_clsd: codebody
           | YST_IF YST_ROUNDO expression code_ifstart YST_ROUNDC ifthen_clsd code_ifelse YST_ELSE ifthen_clsd code_ifendelse
           ;

Примечание: материал с префиксом code_ является mid-actions

Может ли кто-нибудь объяснить мне, как решить эту проблему правильно и почему решение "go -to" либо неверно, либо не сработало? Спасибо, X39

1 Ответ

1 голос
/ 24 апреля 2020

Поскольку эти два правила идентичны вплоть до code_ifelse (и предполагается, что code_ifelse является пустым правилом, как действие в правиле), он не может определить, следует ли уменьшить code_ifelse до или после YST_ELSE. Вы можете исправить это, приведя два правила в соответствие с порядком code_ifelse и YST_ELSE.

Некоторые практические правила для грамматик:

  • Дон Не используйте symbli c имена для одиночных символьных токенов, таких как '(' и ')' - это просто запутывает вещи и делает грамматику трудной для чтения и понимания.
  • Не используйте действия в правилах если в этом нет крайней необходимости - лучше создать одно правило токена с действием конечного правила, которое делает то, что вам нужно.
...