Как решить конфликт сдвига/уменьшения, используя приоритет оператора?

Итак, у меня есть эта грамматика, я пытаюсь построить таблицу LR (1) для

      E' -> E
      E -> E + E
      E -> E * E
      E -> ( E )
      E -> a

Пока это мой стол

введите здесь описание изображения

Я пытаюсь решить конфликты здесь. Я думал об изменении грамматики на постфикс вместо инфикса, но я не совсем уверен, смогу ли я это сделать. Есть идеи?


person Ruba Sbeih    schedule 08.05.2020    source источник
comment
Если вы пытаетесь разрешить конфликты с использованием приоритета, вам следует использовать алгоритм разрешения приоритета. Это описано в Книге Дракона (см. Разбор неоднозначной грамматики), в Bison manual и в любом количестве ответов SO, таких как этот. Если после прочтения материала у вас возник конкретный вопрос по этому простому алгоритму, смело задавайте его.   -  person rici    schedule 08.05.2020


Ответы (1)


Вот ваша грамматика с приоритетом:

E' -> E
E -> E + T
E -> T
T -> T * F
T -> F
F -> ( E )
F -> a

Не забудьте лишние E -> T и T -> F, без них грамматика будет бесполезна.

Примечание. Это не будет работать с LR(0), потому что вы получите конфликт.

person xilpex    schedule 08.05.2020
comment
Можете ли вы объяснить это подробнее? Я не очень понимаю, как вы решили заменить E-›E+E на E-›E+T? - person Ruba Sbeih; 09.05.2020
comment
@RubaSbeih - изменяет способ создания узлов; a будет листовым и т.д. - person xilpex; 09.05.2020