Делая грамматику ll(1) и однозначно

У меня есть CFG в форме

PB := PB | R | R
R := s

Я попытался сделать это ll(1), удалив левую рекурсию, в результате чего

 PB := R PB' | R PB'
 PB' := PB'| ϵ
 R := s

Однако я считаю, что удаление левой рекурсии делает грамматику теперь двусмысленной.

Как это можно исправить?

1 ответ

Решение

Оригинальная грамматика неоднозначна. Исключение левой рекурсии не создает и не устраняет двусмысленность.

Неоднозначность:

PB := PB

Это производство ничего не делает, но его можно применять любое количество раз

PB := R
PB := R

Эти два производства идентичны, так что где бы ни применялось одно, вместо него можно было бы использовать другое.

Когда вы удалите бессмысленные постановки, вы останетесь с

PB := R
R := s

Что однозначно и не рекурсивно. Поскольку он не является рекурсивным, его не нужно удалять.

Другие вопросы по тегам