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

Материал из Викиконспекты
Перейти к: навигация, поиск
(добавлено введение, поправлено определение)
Строка 1: Строка 1:
 
{{В разработке}}
 
{{В разработке}}
  
{{TODO | t = Небольшое введение}}
+
Наибольший интерес в построении синтаксических анализаторов (парсеров) представляют LL(1)-грамматики, так как для них возможно построение нисходящих парсеров без возврата, то есть без корректировки выбранных правил в [[Формальные грамматики | грамматике]]. LL(1)-грамматики являются подмножеством [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора#csgrammar | КС-грамматик]]. Однако для достаточно большого количества [[Основные определения, связанные со строками#deflanguage | формальных языков]] можно построить LL(1)-грамматику, например, для языка арифметических выражений и даже для некоторых языков программирования, в частности можно и для языка Java.
  
 +
== LL(k)-грамматика ==
 +
Дадим теперь формально определение LL(k)-грамматики.
 
{{Определение
 
{{Определение
 
|id=defLLK  
 
|id=defLLK  
 
|definition=
 
|definition=
КС-грамматика <tex> \Gamma </tex> называется '''LL(k)-грамматикой''', если при возникновении следующей ситуации:
+
Пусть <tex>\Gamma =\langle \Sigma, N, S, P \rangle</tex> {{---}} КС-грамматика. Рассмотрим возникновение следующей ситуации во время левостороннего вывода в этой грамматике слова <tex> w </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 \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> {{---}} цепочка из терминалов, уже разобранная часть слова, {{---}} <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> |y| = k </tex> или <tex> |y| < k, \eta = \xi = \varepsilon </tex>, верно, что <tex> \alpha = \alpha' </tex>, то <tex> \Gamma </tex> называется '''LL(k)-грамматикой'''.
 
}}
 
}}
  

Версия 22:02, 27 июня 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)-грамматикой.


TODO: LL(1)-грамматика

TODO: FIRST и FOLLOW, примеры (скобочные последовательности)

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

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

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