Исправление ошибок при разборе LR

Опубликовано: 17 Сентября, 2022

Парсер LR — это восходящий парсер. Он всегда используется для работы с контекстно-свободной грамматикой (CFG). Он обычно используется компиляторами языков программирования, а также другими связанными инструментами. Синтаксический анализатор LR производит крайний левый вывод, используя входные данные слева направо. Создавая из листьев, он помогает сократить производство грамматики верхнего уровня, поэтому его называют восходящим синтаксическим анализатором. Парсеры LR являются самыми мощными среди всех детерминированных парсеров, которые широко используются в настоящее время. Парсеры LR в основном бывают 4 типов :

  1. LR(0) парсер
  2. SLR-парсер
  3. LALR-парсер
  4. CLR-парсер

Исправление ошибок при разборе LR:

Когда для просканированного до сих пор ввода нет допустимого продолжения, синтаксические анализаторы LR сообщают об ошибке. Прежде чем уведомить об ошибке, синтаксический анализатор CLR никогда не выполняет однократное преобразование, а SLR или LALR могут выполнять многократное преобразование, но они никогда не будут перемещать неправильный входной символ в стек.

Когда синтаксический анализатор проверяет таблицу и обнаруживает, что соответствующий элемент действия пуст, при синтаксическом анализе LR распознается ошибка. Записи Goto никогда не могут использоваться для обнаружения ошибок.

LR Parser в основном использует два упомянутых метода для обнаружения ошибок:

  1. Восстановление синтаксической фазы
  2. Восстановление режима паники

Восстановление синтаксической фазы:

Восстановление синтаксической фазы следует указанным шагам:

  1. Ошибки программиста, которые вызывают процедуры ошибок в таблице синтаксического анализатора, определяются на основе языка.
  2. Создание процедур обработки ошибок, которые могут изменять вершину стека и/или определенные символы на входе способом, приемлемым для записей об ошибках таблицы.

Вот некоторые из ошибок, которые обнаруживаются во время восстановления синтаксической фазы:

  1. Ошибки в структуре
  2. Отсутствует оператор
  3. Ключевые слова с ошибками
  4. Несбалансированная скобка

Восстановление режима паники:

Этот подход включает удаление последовательных символов из ввода один за другим, пока не будет получен набор синхронизированных токенов. Разделители, такие как или, являются токенами синхронизации. Преимущество заключается в простоте реализации и гарантирует, что вы не попадете в бесконечный цикл. Недостатком является то, что значительное количество данных пропускается без проверки на наличие дополнительных проблем.

Восстановление режима паники следует указанным шагам:

  1. Сканируйте стек, пока не найдете состояние «a» с помощью goto() на определенном нетерминале «B» (путем удаления состояний из стека).
  2. Пока не идентифицирован символ «b», который может следовать за «B», ноль или более входных символов отклоняются.

Пример восстановления после ошибки с помощью LR Parser:

Рассмотрим следующую грамматику для обнаружения ошибок:

E → E + E 
E → E * E 
E → ( E ) 
E → id

Шаг 1: Сначала создайте таблицу синтаксического анализа для данной грамматики:

Шаг 2: Пусть строка, заданная для анализа, имеет вид:

String: id+)$

Шаг 3: Теперь работа парсера с заданной строкой описана ниже:

КУЧА ВХОД
0 идентификатор+)$
0id3 +)$
0E1 +)$
0Е1 + 4 )$
0Е1 + 4 $
0E1 + 4id3 $
0Е1 + 4Е7 $
0E1 $

Шаг 4: Вывод выдается в виде обнаружения ошибки:

Action(4, )) = error i.e.,
“unbalanced right parenthesis” c2
removes right parenthesis “missing
operand” e2 pushes id3 on stack

Таким образом, ошибка обнаруживается с помощью парсера LR таким образом.