LL (1) -парсер нуждается в символе lookahead для определения того, какую продукцию использовать. Именно по этой причине я всегда считал, что термин «lookahead» используется, когда парсер смотрит на следующий входной токен, не «потребляя» его (т. Е. Он все еще может быть прочитан с ввода следующим действием). Однако аналитики LR (0) не сомневались, что это правильно:Не является парсером LR (0) с использованием lookaheads?
В каждом примере LR (0) -пармеров, который я видел, также используется следующий токен ввода для принятия решения о необходимости сдвига или уменьшения. В случае уменьшения входной токен не потребляется.
Я использовал бесплатный инструмент «ParsingEmu» для создания LR-таблицы и выполнения оценки LR ниже для слова «aab». Как видите, в заголовке столбца есть токены. Из оценки вы можете видеть, что синтаксический анализатор решает, какой столбец использовать, просматривая следующий токен ввода. Но когда парсер уменьшает шаги с 4 по 6, вход не изменяется (хотя парсеру необходимо знать следующий входной токен «$» при выполнении перехода к следующему состоянию).
Грамматика:
S -> A
A -> aA
A -> b
Таблица:
Оценка:
Теперь я сделал следующие предположения по причине моего замешательства:
Мое предположение для определения «lookahead» (lookahead = входной токен, который не потребляется) неверен. Lookahead просто означает две разные вещи для LL-парсеров или LR-парсеров. Если да, то каким образом можно определить «lookahead»?
LR-синтаксические анализаторы имеют (с теоретической точки зрения, когда вы будете использовать push-down automaton) дополнительные внутренние состояния, в которых они потребляют входной токен, помещая его в стек и, следовательно, могут сделать shift-reduce - решение, просто глядя на стек.
Оценка, показанная выше, представляет собой LR (1). Если это так, будет выглядеть оценка LR (0)?
Теперь, что правильно, 1, 2 или 3 или что-то совсем другое?
Возможный дубликат [Как может парсер LR (0) когда-либо покинуть состояние 0?] (Http://stackoverflow.com/questions/13084829/how-can-an-lr0-parser-ever-leave-state- 0) (мой собственный вопрос) – Mehrdad