Формулировка задачи

Расширив грамматику , построить ее LR(0)-автомат:

Решение

Построение расширенной грамматики по

Соответствующая расширенная грамматика строится по определению

Построение LR(0)-автомата по грамматике

Построим по определению

LR(0)-автомат

эпсилон-замыкание автомата LR(0)-пунктов

Link to original

Автомат LR(0)-пунктов

Автоматом LR(0)-пунктов расширенной грамматики называется неполный эпсилон-НКА , где

Функция переходов задается следующим образом:

Link to original

Построим Автомат LR(0)-пунктов, сразу замыкая состояния по в одно состояние

stateDiagram-v2
    [*] --> $$S$$
    $$S$$ --> $$D$$ : $$D$$
    $$S$$ --> $$L$$ : $$L$$
    $$S$$ --> $$a_1$$ : $$a$$
    $$L$$ --> #58; : #58;
    $$L$$ --> $$;$$ : #59;
    #58; --> $$T$$ : $$T$$
    #58; --> $$i$$ : $$i$$
    $$;$$ --> $$a_2$$ : $$a$$

    classDef finalState fill:#c8e6c9,stroke:#4caf50,stroke-width:3px
    
    class D finalState
    class a1 finalState
    class T finalState
    class i finalState
    class a2 finalState

является LR(0)-грамматикой. Поэтому можем построить ее LR(0)-анализатор с использованием алгоритма построения LR(0)-анализатора

Построение LR(0)-анализатора для грамматики

LR(0)-анализатор

LR-анализатор построенный по LR(0)-грамматике

Link to original

LR-анализатор

LR-анализатором расширенной грамматики называется таблица Action/GOTO, в которой строки соответствуют состояниям какого-то ДКА , построенного по грамматике , столбцы символам из

ACTIONGOTO
Состояние

Множество действий ACTION может быть 4 видов:

  • - допуск
  • - перенос ( - название состояния в соответсвующем LR(0)-автомате, по которому строится анализатор)
  • - свертка (по правилу с номером )
  • - ошибка анализа с номером (опционально)

В столбцах нетерминалов GOTO стоят состояния автомата

Вид автомата зависит от вида анализатора, который требуется построить

Также так могут называть автомат с магазинной памятью, который работает по правилам, опирающимся на таблицу анализатора

Link to original

Алгоритм. Построение LR(0)-анализатора

Вход

LR(0)-грамматика

Выход

LR(0)-анализатор

Алгоритм

Построим LR(0)-автомат по входной грамматике (должны уже были построить для проверки, что входная грамматика LR(0)-грамматика)

Заполнение столбцов ACTION

  1. Занумеровать правила грамматики от одного до
  2. В строке, соответствующей состоянию в столбце заносим допуск
  3. В строках, соответствующих состоянию автомата , кроме заполненной ранее (состояние ), в каждом столбце (включая ) заносим свертку ( ),
  4. В строках , соответствующих состояниям, не заполненным ранее, для заносим перенос , если

Заполнение столбцов GOTO

В каждой строке для заносим состояние , если функция перехода определена

Link to original

Нумерация правил грамматики

СостояниеACTIONGOTO
  • - В начале строки допустим только символ a
  • - Пустая строка недопустима
  • - Символы a не могут идти рядом
  • - Символы a и i не могут стоять рядом
  • - Строка не может закончиться символом a
  • - После i может идти только символ a
  • - После символа : может следовать только i
  • - После символа i не могут стоять символы