LR(k)-грамматики — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Перенос-свертка)
Строка 37: Строка 37:
 
* не более <tex>k</tex> символов цепочки (англ. ''k-token lookahead'') используются для принятия решения.
 
* не более <tex>k</tex> символов цепочки (англ. ''k-token lookahead'') используются для принятия решения.
  
=== Структура LR-разборщика ===
+
== LR-разборщик ==
 +
 
 +
=== Структура ===
 
При LR(k)-анализе применяется метод '''перенос-свертка''' (англ. ''shift-reduce''). Этот метод использует:
 
При LR(k)-анализе применяется метод '''перенос-свертка''' (англ. ''shift-reduce''). Этот метод использует:
 
* Стек
 
* Стек
Строка 47: Строка 49:
 
Суть метода сводится к следующему. Символы входной цепочки переносятся в магазин до тех пор, пока на вершине магазина не накопится цепочка, совпадающая с правой частью какого-нибудь из правил (операция '''перенос'''). Далее все символы этой цепочки извлекаются из магазина и на их место помещается нетерминал, находящийся в левой части этого правила (операция '''свертка'''). Входная цепочка допускается автоматом, если после переноса в автомат последнего символа входной цепочки и выполнения операции свертка, в магазине окажется только аксиома грамматики.
 
Суть метода сводится к следующему. Символы входной цепочки переносятся в магазин до тех пор, пока на вершине магазина не накопится цепочка, совпадающая с правой частью какого-нибудь из правил (операция '''перенос'''). Далее все символы этой цепочки извлекаются из магазина и на их место помещается нетерминал, находящийся в левой части этого правила (операция '''свертка'''). Входная цепочка допускается автоматом, если после переноса в автомат последнего символа входной цепочки и выполнения операции свертка, в магазине окажется только аксиома грамматики.
  
== Управляющая программа анализатора ==
+
=== Управляющая программа анализатора ===
 
Для определения, какую операцию применить(перенос-свертку), используем управляющую таблицу. Управляющая программа одинакова для всех LR-анализаторов, а таблица изменяется от одного анализатора к другому. Программа анализатора читает последовательно символы входной цепочки. Программа использует магазин для запоминания строки следующего вида <tex>s_0X_1s_1X_2...X_ms_m</tex>, где <tex>s_m</tex> {{---}} вершина магазина. Каждый <tex>X_i</tex> {{---}} символ грамматики, а <tex>s_i</tex> {{---}} символ, называемый состоянием. Каждое состояние суммирует информацию, cодержащуюся в стеке перед ним.  
 
Для определения, какую операцию применить(перенос-свертку), используем управляющую таблицу. Управляющая программа одинакова для всех LR-анализаторов, а таблица изменяется от одного анализатора к другому. Программа анализатора читает последовательно символы входной цепочки. Программа использует магазин для запоминания строки следующего вида <tex>s_0X_1s_1X_2...X_ms_m</tex>, где <tex>s_m</tex> {{---}} вершина магазина. Каждый <tex>X_i</tex> {{---}} символ грамматики, а <tex>s_i</tex> {{---}} символ, называемый состоянием. Каждое состояние суммирует информацию, cодержащуюся в стеке перед ним.  
  

Версия 10:48, 29 августа 2015

Восходящий разбор (англ. Bottom-up parsing) предназначен для построения дерево разбора. Мы можем представить себе этот процесс как "свертку" исходной строки w к правилу грамматики. Каждый шаг свертки заключается в сопоставлении некоторой подстроки w и правой части какого-то правила грамматики, затем происходит замена этой подстроки на нетерминал, являющийся левой частью правила. Восходящий разбор менее интуитивный, чем нисходящий, но зато позволяет разбирать большее множество грамматик.

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

Определение:
Пусть Γ=Σ,N,S,Pконтекстно-свободная грамматика. Пополненной грамматикой (англ. augmented grammar), полученной из Γ, назовем грамматику Γ=Σ,N,S,P, где Σ=Σ;N=N{S};SN;P=P{SS}


Использование в определении LR(k)-грамматики пополненной грамматики существенно для однозначного определения конца анализа. Действительно, если грамматика использует S в правых частях правил, то свертка основы в S не может служить сигналом приема входной цепочки. Свертка же в S в пополненной грамматике служит таким сигналом, поскольку S нигде, кроме начальной сентенциальной формы, не встречается.

// TODO сделать пример, когда нам точно нужно пополнять грамматику

// TODO написать нормальное определение LR(k)-грамматики


Определение:
Пусть Γ=Σ,N,S,P — пополненная грамматика для КС-грамматики Γ. Грамматика Γ явяется LR(k)-грамматикой, если для любых двух правосторонних выводов вида:
  • SαAwαβw,
  • SγBxαβy,
в которых FIRSTk(w)=FIRSTk(y), должно быть αAy=γBx. Другими словами, α=γ,A=B,y=x.


Говоря неформально, если согласно первому выводу β — основа, сворачиваемая в нетерминал A, то и во втором выводе β должна быть основой, сворачиваемой в нетерминал A. Из этого определения следует, что если имеется правовыводимая цепочка αi=αβw, где β — основа, полученная из A, и если αβ=X1X2...Xr, то

  • зная первые символы X1X2...Xj цепочки αβ и не более, чем k следующих символов цепочки Xj+1Xj+2...Xrw, мы можем быть уверены, что правый конец основы не будет достигнут до тех пор, пока jr;
  • зная цепочку αβ=X1X2...Xr и не более k символов цепочки w, мы можем быть уверены, что именно β является основой, сворачиваемой в нетерминал A;
  • если αi1=S, можно сигнализировать о выводимости исходной терминальной цепочки из S и, следовательно, из S.

// TODO end

LR(k) означает, что

  • входная цепочка обрабатывается слева направо (англ. left-to-right parse);
  • выполняется правый вывод (англ. rightmost derivation);
  • не более k символов цепочки (англ. k-token lookahead) используются для принятия решения.

LR-разборщик

Структура

При LR(k)-анализе применяется метод перенос-свертка (англ. shift-reduce). Этот метод использует:

  • Стек
  • Входная цепочка
  • Управляющая таблица
  • Автомат

Принцип переноса-свёртки

Суть метода сводится к следующему. Символы входной цепочки переносятся в магазин до тех пор, пока на вершине магазина не накопится цепочка, совпадающая с правой частью какого-нибудь из правил (операция перенос). Далее все символы этой цепочки извлекаются из магазина и на их место помещается нетерминал, находящийся в левой части этого правила (операция свертка). Входная цепочка допускается автоматом, если после переноса в автомат последнего символа входной цепочки и выполнения операции свертка, в магазине окажется только аксиома грамматики.

Управляющая программа анализатора

Для определения, какую операцию применить(перенос-свертку), используем управляющую таблицу. Управляющая программа одинакова для всех LR-анализаторов, а таблица изменяется от одного анализатора к другому. Программа анализатора читает последовательно символы входной цепочки. Программа использует магазин для запоминания строки следующего вида s0X1s1X2...Xmsm, где sm — вершина магазина. Каждый Xi — символ грамматики, а si — символ, называемый состоянием. Каждое состояние суммирует информацию, cодержащуюся в стеке перед ним.

Программа ведет себя следующим образом:

Происходит обращение к таблице: action[sm,ai], где

  • sm — текущее состояние на вершине магазина, каждое состояние суммирует информацию, cодержащуюся в стеке перед ним,
  • ai — текущий входной символ;

Результат может иметь одно из четырех значений:

  • переход в стостояние s, (shift)
  • свертка по правилу Aβ, (reduce),
  • допуск, (accept),
  • ошибка, (error).

 bool algorithmLR(w: string)
     ip — указатель на перый символ в строке w
     while цепочка не закончилась
         s = top()
         a = w[ip]
         if action [s, a] == shift s’ 
             push(a)
             push(s’)
             ip++
         else if action [s, a] == reduce A β 
             for j = 1 to |β|  
                 pop()
                 pop()
             s’ = top()
             push(A)
             push(goto [s’, A]) 
             Вывод правила (A β)
         else if action [s, a] == accept 
             return success
         else 
             return error     

Функция goto получает состояние и символ грамматики и выдает состояние. Функция goto, строящаяся по грамматике Γ, есть функция переходов детерминированного магазинного автомата, который распознает язык, порождаемый грамматикой Γ.

См. также

Источники информации