LL(k)-грамматики, множества FIRST и FOLLOW — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(добавлено введение, поправлено определение)
(добавлены определения множеств FIRST и FOLLOW)
Строка 11: Строка 11:
 
* <tex> S \Rightarrow^* p A \beta \Rightarrow  p \alpha \beta \Rightarrow^* p y \eta </tex>
 
* <tex> S \Rightarrow^* p A \beta \Rightarrow  p \alpha \beta \Rightarrow^* p y \eta </tex>
 
* <tex> S \Rightarrow^* p A \beta \Rightarrow  p \alpha' \beta \Rightarrow^* p y \xi </tex>
 
* <tex> S \Rightarrow^* p A \beta \Rightarrow  p \alpha' \beta \Rightarrow^* p y \xi </tex>
где <tex> S </tex> {{---}} стартовый нетерминал грамматики, <tex> p </tex> и <tex> y </tex> {{---}} цепочки из терминалов, уже разобранная часть слова <tex> w </tex>, <tex> A </tex> {{---}} нетерминал грамматики, в которой есть правила <tex> A \rightarrow \alpha </tex> и  <tex> A \rightarrow \alpha' </tex>, <tex> \alpha, \alpha', \beta, \eta, \xi </tex> {{---}} последовательности из терминалов и нетерминалов.<br>
+
где <tex> S </tex> {{---}} стартовый нетерминал грамматики, <tex> p </tex> и <tex> y </tex> {{---}} цепочки из терминалов, уже разобранная часть слова <tex> w </tex>, <tex> A </tex> {{---}} нетерминал грамматики, в которой есть правила <tex> A \rightarrow \alpha </tex> и  <tex> A \rightarrow \alpha' </tex>, причём <tex> \alpha, \alpha', \beta, \eta, \xi </tex> {{---}} последовательности из терминалов и нетерминалов.<br>
 
Тогда если при выполнении условий, что <tex> |y| = k </tex> или <tex> |y| < k, \eta = \xi = \varepsilon </tex>, верно, что <tex> \alpha = \alpha' </tex>, то <tex> \Gamma </tex> называется '''LL(k)-грамматикой'''.
 
Тогда если при выполнении условий, что <tex> |y| = k </tex> или <tex> |y| < k, \eta = \xi = \varepsilon </tex>, верно, что <tex> \alpha = \alpha' </tex>, то <tex> \Gamma </tex> называется '''LL(k)-грамматикой'''.
 
}}
 
}}
 +
Неформально это означает, что если мы уже вывели какой-то префикс разбираемого слова, то, посмотрев на следующие <tex> k </tex> cимволов, сможем одназначно выбрать правило вывода.
 +
{{TODO | t = картинка}}
  
{{TODO | t = LL(1)-грамматика}}
+
LL(1)-грамматика является частным случаем. Её определение почти такое же, только вместо строки <tex> y </tex> один символ <tex> c \in \Sigma \cup \{\varepsilon\} </tex>.
{{TODO | t = FIRST и FOLLOW, примеры (скобочные последовательности)}}
+
 
 +
== FIRST и FOLLOW ==
 +
Ключевую роль в построении парсеров для LL(1)-грамматик играю множества <tex> \mathrm{FIRST} </tex> и <tex> \mathrm{FOLLOW} </tex>.
 +
 
 +
Пусть <tex> c </tex> {{---}} символ из алфавита <tex> \Sigma </tex>, <tex> \alpha,\ \beta </tex> {{---}} строки из нетерминалов и терминалов (возможно пустые), <tex> S,\ A </tex> {{---}} нетерминалы грамматики (начальное и произвольное соответственно), <tex> \$ </tex> {{---}} символ окончания слова. Также будем считать, что в грамматике нет [[Удаление бесполезных символов из грамматики | недостижимых правил]]. Тогда определим <tex> \mathrm{FIRST} </tex> и <tex> \mathrm{FOLLOW} </tex> следующим образом:
 +
{{Определение
 +
|id=deffirst
 +
|definition=
 +
<tex> \mathrm{FIRST}(\alpha) = \{c \mid \alpha \Rightarrow^* c \beta \} \cup \{ \varepsilon\ \mathrm{if}\ \alpha \Rightarrow^* \varepsilon \} </tex>
 +
}}
 +
{{Определение
 +
|id=deffirst
 +
|definition=
 +
<tex> \mathrm{FOLLOW}(A) = \{c \mid S \Rightarrow^* \alpha A c \beta \} \cup \{ \$ \mathrm{if}\ \S \Rightarrow^* \alpha A \} </tex>
 +
}}
 +
Другими словами, <tex> \mathrm{FIRST}(\alpha) </tex> {{---}} все символы (терминалы), с которых могут начинаться всевозможные выводы из <tex> \alpha </tex>, а <tex> \mathrm{FOLLOW}(A) </tex> {{---}} всевозможные символы, которые встречаются после нетерминала <tex> A </tex> во всех правилах грамматики.
 +
=== Примеры ===
 +
{{TODO | t = Какие-нибудь примеры}}
 +
== Теорема о связи LL(1)-грамматики с множествами FIRST и FOLLOW ==
 
{{TODO | t = Теорема об LL(1)-грамматиках}}
 
{{TODO | t = Теорема об LL(1)-грамматиках}}
 
{{TODO | t = Пара следствий}}
 
{{TODO | t = Пара следствий}}
{{TODO | t = Какие-нибудь примеры}}
+
 
 +
== См. также ==
 +
== Источники информации ==
 +
*
 +
 
 +
 
 +
[[Категория: Методы трансляции]]
 +
[[Категория: Нисходящий разбор]]

Версия 00:52, 28 июня 2014

Эта статья находится в разработке!

Наибольший интерес в построении синтаксических анализаторов (парсеров) представляют LL(1)-грамматики, так как для них возможно построение нисходящих парсеров без возврата, то есть без корректировки выбранных правил в грамматике. LL(1)-грамматики являются подмножеством КС-грамматик. Однако для достаточно большого количества формальных языков можно построить LL(1)-грамматику, например, для языка арифметических выражений и даже для некоторых языков программирования, в частности можно и для языка Java.

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

Дадим теперь формально определение LL(k)-грамматики.

Определение:
Пусть [math]\Gamma =\langle \Sigma, N, S, P \rangle[/math] — КС-грамматика. Рассмотрим возникновение следующей ситуации во время левостороннего вывода в этой грамматике слова [math] w [/math]:
  • [math] S \Rightarrow^* p A \beta \Rightarrow p \alpha \beta \Rightarrow^* p y \eta [/math]
  • [math] S \Rightarrow^* p A \beta \Rightarrow p \alpha' \beta \Rightarrow^* p y \xi [/math]

где [math] S [/math] — стартовый нетерминал грамматики, [math] p [/math] и [math] y [/math] — цепочки из терминалов, уже разобранная часть слова [math] w [/math], [math] A [/math] — нетерминал грамматики, в которой есть правила [math] A \rightarrow \alpha [/math] и [math] A \rightarrow \alpha' [/math], причём [math] \alpha, \alpha', \beta, \eta, \xi [/math] — последовательности из терминалов и нетерминалов.

Тогда если при выполнении условий, что [math] |y| = k [/math] или [math] |y| \lt k, \eta = \xi = \varepsilon [/math], верно, что [math] \alpha = \alpha' [/math], то [math] \Gamma [/math] называется LL(k)-грамматикой.

Неформально это означает, что если мы уже вывели какой-то префикс разбираемого слова, то, посмотрев на следующие [math] k [/math] cимволов, сможем одназначно выбрать правило вывода.

TODO: картинка

LL(1)-грамматика является частным случаем. Её определение почти такое же, только вместо строки [math] y [/math] один символ [math] c \in \Sigma \cup \{\varepsilon\} [/math].

FIRST и FOLLOW

Ключевую роль в построении парсеров для LL(1)-грамматик играю множества [math] \mathrm{FIRST} [/math] и [math] \mathrm{FOLLOW} [/math].

Пусть [math] c [/math] — символ из алфавита [math] \Sigma [/math], [math] \alpha,\ \beta [/math] — строки из нетерминалов и терминалов (возможно пустые), [math] S,\ A [/math] — нетерминалы грамматики (начальное и произвольное соответственно), [math] \$ [/math] — символ окончания слова. Также будем считать, что в грамматике нет недостижимых правил. Тогда определим [math] \mathrm{FIRST} [/math] и [math] \mathrm{FOLLOW} [/math] следующим образом:

Определение:
[math] \mathrm{FIRST}(\alpha) = \{c \mid \alpha \Rightarrow^* c \beta \} \cup \{ \varepsilon\ \mathrm{if}\ \alpha \Rightarrow^* \varepsilon \} [/math]


Определение:
[math] \mathrm{FOLLOW}(A) = \{c \mid S \Rightarrow^* \alpha A c \beta \} \cup \{ \$ \mathrm{if}\ \S \Rightarrow^* \alpha A \} [/math]

Другими словами, [math] \mathrm{FIRST}(\alpha) [/math] — все символы (терминалы), с которых могут начинаться всевозможные выводы из [math] \alpha [/math], а [math] \mathrm{FOLLOW}(A) [/math] — всевозможные символы, которые встречаются после нетерминала [math] A [/math] во всех правилах грамматики.

Примеры

TODO: Какие-нибудь примеры

Теорема о связи LL(1)-грамматики с множествами FIRST и FOLLOW

TODO: Теорема об LL(1)-грамматиках

TODO: Пара следствий

См. также

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