Устранение неопределенности, вызванной висящим остальным для грамматик LL(1)
В случае с висячей остальной проблемой при проектировании компилятора, есть ли причина оставить это перед тем, как устранить неоднозначность?
Мы преобразовываем CFG в грамматику LL(1), поэтому мой профессор просит нас сначала исключить рекурсию, затем оставить фактор, а затем убрать неоднозначность из нашей грамматики. Но из того, что я прочитал, двусмысленность обычно устраняется в первую очередь. Я не уверен, как устранить неопределенность после левого факторинга.
Вот как я получил после того, как оставил факторинг:
S -> i E t S S' | other
S' -> e S | epsilon
Однако, насколько я понимаю, устранение неоднозначности требует переписывания грамматики, чтобы грамматика всегда получалась похожей на это право?
S -> U | M
M -> i E t M e M | other
U -> i E t U'
U' -> M e U | S
Или есть другой способ сделать это? Насколько я могу видеть, это единственный способ убрать неопределенность из-за других.
2 ответа
Я думаю, что это может быть возможным ответом:
[После оставленного факторинга и делая его однозначным]
Пусть другие =
S -> iEtT |
T -> S | Айз
Я генерирую все if первым и связываю остальное с недавним неассоциированным if. Если мне нужно получить другое, я должен исключить возможность получения нового if между текущим неассоциированным if и соответствующим else.
Однако я даю возможность получить if после генерации соответствующего else.
Укажите, есть ли ошибки.
Спасибо.
Как выясняется, хороший способ справиться с неоднозначностью, вызванной зависанием в LL(1), - обработать его в синтаксическом анализаторе. Переписать грамматику - это еще один способ справиться с ней, так же как и добавить "начало" и "конец" в грамматику следующим образом:
S -> i E t a S z S' | other
S' -> e S | epsilon
Хотя это может быть интуитивно понятно для некоторых, для других начинающих, это то, что означают символы:
S: Заявление
я: если
E: выражение
т: тогда
а: начало
z: end
S ': Заявление'
E: еще
другое: любые другие производства
Примечание: строчные буквы обозначают терминалы; Прописные буквы представляют переменные.
Если что-то не так, пожалуйста, дайте мне знать, и я исправлю это.