Устранение неопределенности, вызванной висящим остальным для грамматик 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: еще

другое: любые другие производства

Примечание: строчные буквы обозначают терминалы; Прописные буквы представляют переменные.

Если что-то не так, пожалуйста, дайте мне знать, и я исправлю это.

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