Изменения

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

LR(1)-разбор

265 байт убрано, 01:59, 11 сентября 2016
опечатка в правиле грамматики
changed = ''false''
'''for''' $[A\rightarrow\alpha\cdot B\beta, a]\in I$
'''for''' $(B\rightarrow\gamma)\in \Gamma'.P$
'''for''' $b\in FIRST(\beta\alpha)$
$J$.add($[B\rightarrow\cdot\gamma,b]$)
'''item'''[][] items($\Gamma'$):
'''bool''' changed
'''item'''[][] $C = \{$ $C$.add($closure(\{[S'\rightarrow\cdot S,\char36]\})\}$)
'''repeat'''
changed = ''false''
* $S'\rightarrow S$
* $S\rightarrow CC$
* $SC\rightarrow cC\mid d$
Запустим процедуру $items(\Gamma')$. Она начинается с вычисления $closure([S\rightarrow S', \char36])$. Это правило вида $[A\rightarrow\alpha\cdot B\beta, a]$, где $A=S';\alpha=\varepsilon;B=S;\beta=\varepsilon;a=\char36$.
=== Канонические LR(1)-таблицы ===
В алгоритме будут использоваться структуры, описанные в конспекте про про [[LLLR(k)-грамматики, множества FIRST и FOLLOW]]
==== Алгоритм ====
<font color=green>// вход: <tex>\Gamma'</tex> {{---}} расширенная грамматика</font>
<font color=green>// выход: таблицы таблица <tex>ACTION</tex> и <tex>GOTOT</tex> канонического <tex>LR(1)</tex>-анализа</font> '''function''' <tex>\mathtt{getLR1LexTablegetLR1CanonicalTable}(\Gamma'):</tex>
<tex> C'(\Gamma') \leftarrow \{I_0,I_1..I_n\}</tex> <font color=green>// множество канонических ситуаций для <tex>\Gamma'</tex></font>
<tex>\mathtt{fillArray}(ACTIONT,</tex> '''Error'''<tex> ):</tex>
'''foreach''' <tex>I_i \in (E(G))\</tex>
'''if''' <tex>[A\rightarrow \alpha\cdot a\beta, b] \in I_i</tex> '''and''' <tex>GOTOgoto(I_i,a) = I_j</tex> <font color=green>// здесь <tex>a</tex> {{---}} терминал</font> <tex>ACTIONT[i,a] = </tex> '''Shift'''(<tex>j</tex>)
'''if''' <tex>[A\rightarrow \alpha\cdot, a] \in I_i</tex> '''and''' <tex>A\neq S'</tex>
<tex>ACTIONT[i,a] = </tex> '''Reduce'''(<tex>A \to a</tex>)
'''if''' <tex>[S'\rightarrow S\cdot, \char36] \in I_i</tex>
<tex>ACTIONT[i,\char36] = </tex> '''Accept''' '''if''' <tex>GOTOgoto(I_i,A) = I_j</tex> <tex>GOTOgoto[i,A]\leftarrow j</tex>
Если в процессе построения обнаружатся конфликтующие действия {{---}} это значит, что грамматика не принадлежит классу LR(1)
==== Пример ====
<wikitex>
Рассмотрим следующую грамматику $G\Gamma$:
# $S\rightarrow CC$
# $C\rightarrow cC$
# $C\rightarrow d$
Приведем каноническую таблицу синтаксического анализа <tex>T</tex> для этой грамматики:{| cellspacingstyle="background-color:#CCC;margin:0.5px" cellpadding! style="10" background-color:#EEE;text-align=:center"left" border| !style="1background-color:#EEE;padding:2px 20px;text-align:center"|$S$! rowspanstyle="2background-color:#EEE;padding:2px 20px;text-align:center" |$C$!style="background-color:#EEE;padding:2px 20px;text-align:center"| Состояние$c$! colspan="3" style="background-color:#EEE;padding:2px 20px;text-align:center" | $ACTIONd$! colspan="2" style="background-color:#EEE;padding:2px 20px;text-align:center" |$GOTO\char36$
|-
|style="background-color:#FFFEEE;padding:2px 20px;text-align:center"|$c$|style="background-color:#FFF;padding:2px 20px;text-align:center"|$d$|style="background-color:#FFF;padding:2px 20px;text-align:center"|$\char36$|style="background-color:#FFF;padding:2px 20px;text-align:center"|$S0$|style="background-color:#FFF;padding:2px 20px;text-align:center"|$C1$|-|style="background-color:#FFF;padding:2px 20px;text-align:center"|$02$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(3)$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(4)$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$1$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$2$
|-
|style="background-color:#FFFEEE;padding:2px 20px;text-align:center"|$1$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 10px;text-align:center"| '''Accept'''
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 10px;text-align:center"| '''Accept'''
|-
|style="background-color:#EEE;padding:2px 20px;text-align:center"|$2$|style="background-color:#FFF;padding:2px 20px"||style="background-color:#FFF;padding:2px 20px;text-align:center"|$25$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(6)$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(7)$
|style="background-color:#FFF;padding:2px 20px"|
|-
|style="background-color:#EEE;padding:2px 20px;text-align:center"|$3$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$5$|-|style="background-color:#FFF;padding:2px 20px;text-align:center"|$38$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(3)$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(4)$
|style="background-color:#FFF;padding:2px 20px"|
|-
|style="background-color:#EEE;padding:2px 20px;text-align:center"|$4$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$8$
|-
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$4$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$r(1)$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$r(3)$
|style="background-color:#FFF;padding:2px 20px"|
|-
|style="background-color:#EEE;padding:2px 20px;text-align:center"|$5$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|-
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$5$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$r(1)$
|-
|style="background-color:#EEE;padding:2px 20px;text-align:center"|$6$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$9$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(6)$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(7)$
|style="background-color:#FFF;padding:2px 20px"|
|-
|style="background-color:#FFFEEE;padding:2px 20px;text-align:center"|$6$|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(6)$|style="background-color:#FFF;padding:2px 20px;text-align:center"|$s(7)$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$9$
|-
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$7$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$r(3)$
|-
|style="background-color:#EEE;padding:2px 20px;text-align:center"|$8$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|-
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$8$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$r(2)$
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$r(2)$
|style="background-color:#FFF;padding:2px 20px"|
|-
|style="background-color:#EEE;padding:2px 20px;text-align:center"|$9$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|-
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$9$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px;text-align:center"|$r(2)$
|style="background-color:#FFF;padding:2px 20px"|
|style="background-color:#FFF;padding:2px 20px"|
|}
<br clear="left">
* [http://gas-teach.narod.ru/au/tfl/tfl13.pdf Лекции по теории формальных языков, LR(0)-, SLR(1)-, LR(1)- и LALR(1)-анализ ]
[[Категория: Теория формальных языковМетоды трансляции]][[Категория: Контекстно-свободные грамматикиВосходящий разбор]]
Анонимный участник

Навигация