Я углубляюсь в анализ и столкнулся с проблемой, которую я не совсем понимаю.Я составил следующую грамматику:
S = R | aSc
R = b | RbR
, где S - начальный символ.Можно показать, что abbbc - это правильное предложение, основанное на этой грамматике, надеюсь, это правильно, но я, возможно, что-то совершенно не понял.Если я попытаюсь реализовать это с помощью рекурсивного спуска, у меня, похоже, возникнет проблема при попытке разобрать abbbc, используя вывод слева, например
S => aSc
aSc => aRc
, в этот момент я бы подумал, что рекурсивное спуск выберет первый вариантво втором производстве, потому что следующий токен b ведет к:
aRc => abc
, и мы закончили, поскольку нет больше нетерминалов, что, конечно, не abbbc.Единственный способ показать, что abbbc действителен, - это выбрать второй вариант, но, с одной стороны, я предполагаю, что он всегда выберет b.Я не думаю, что грамматика неоднозначна, если я что-то пропустил.Так что я делаю не так?
Обновление: Я наткнулся на это замечательное приложение для деривации на https://web.stanford.edu/class/archive/cs/cs103/cs103.1156/tools/cfg/. Я использовал для проверки работоспособности, что abbbc является допустимым предложением, и оноявляется.
Размышляя больше об этой проблеме, правда ли сказать, что я не могу использовать LL (1) для разбора этой грамматики, но на самом деле нужен LL (2)?С двумя взглядами я мог правильно выбрать второй вариант во втором производстве, потому что теперь я также знаю, что есть больше токенов, которые нужно прочитать, и поэтому выбор b преждевременно прервет деривацию.