Изменения

Перейти к: навигация, поиск

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

69 байт добавлено, 12:22, 29 августа 2015
LR-разборщик
=== Принцип переноса-свёртки ===
При LR(k)-анализе применяется метод '''перенос-свертка''' (англ. ''shift-reduce''). Суть метода сводится к следующему. :
* Программа анализатора читает последовательно символы входной строки до тех пор, пока не накопится цепочка, совпадающая с правой частью какого-нибудь из правил. Рассмотренные символы переносим в стек (операция '''перенос''').
* Далее все символы совпадающей цепочки извлекаются из стека и на их место помещается нетерминал, находящийся в левой части этого правила (операция '''свертка''').
=== Структура ===
Метод '''перенос-свертка''' использует следующие компоненты:
* Входная строка
* Стек (для запоминания рассмотренных символов)
* Входная строка
* Управляющая таблица (для определения, какое действие применить - перенос или свертку)
* Автомат (для запоминания информации о текущем состоянии стека)
Для запоминания строки запись в стек имеет вид: <tex>s_0X_1s_1X_2...X_ms_m</tex>, где <tex>s_m</tex> {{---}} вершина стека. Каждый <tex>X_i</tex> {{---}} символ грамматики(терминал или нетерминал), а <tex>s_i</tex> {{---}} состояние автомата. Каждое состояние суммирует информацию, cодержащуюся в стеке перед ним. <tex>s_0</tex> {{---}} стартовае состояние автомата.
Ображение Обращение к таблице происходит по паре <tex>[s_m, a_i]</tex>, где
*<tex>s_m</tex> {{---}} текущее состояние автомата,
*<tex>a_i</tex> {{---}} текущий входной символ;
*допуск <tex>(accept)</tex>,
*ошибка <tex>(error)</tex>.
 
=== Алгоритм ===
# Программа читает символ из входной цепочки.
# Обращается к утравляющей таблице.
# Совершает соответствующее действие.
# Возвращается к первому пункту, пока входная цепочка не закончится.
{| border="0"
<font size=2>
'''bool''' algorithmLR(w: '''string''')
ip curToken {{---}} указатель на перый символ в строке w
'''while''' цепочка не закончилась
s = top()
Вывод правила (A <tex> \to \beta</tex>)
'''else''' '''if''' action [s, a] == accept
'''return''' successtrue
'''else'''
'''return''' error false
</font>
|}
297
правок

Навигация