LL(k)-грамматики, множества FIRST и FOLLOW — различия между версиями
Shersh (обсуждение | вклад) |
Shersh (обсуждение | вклад) (добавлено введение, поправлено определение) |
||
Строка 1: | Строка 1: | ||
{{В разработке}} | {{В разработке}} | ||
− | + | Наибольший интерес в построении синтаксических анализаторов (парсеров) представляют LL(1)-грамматики, так как для них возможно построение нисходящих парсеров без возврата, то есть без корректировки выбранных правил в [[Формальные грамматики | грамматике]]. LL(1)-грамматики являются подмножеством [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора#csgrammar | КС-грамматик]]. Однако для достаточно большого количества [[Основные определения, связанные со строками#deflanguage | формальных языков]] можно построить LL(1)-грамматику, например, для языка арифметических выражений и даже для некоторых языков программирования, в частности можно и для языка Java. | |
+ | == LL(k)-грамматика == | ||
+ | Дадим теперь формально определение LL(k)-грамматики. | ||
{{Определение | {{Определение | ||
|id=defLLK | |id=defLLK | ||
|definition= | |definition= | ||
− | + | Пусть <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 | + | * <tex> S \Rightarrow^* p A \beta \Rightarrow p \alpha' \beta \Rightarrow^* p y \xi </tex> |
− | где <tex> S </tex> {{---}} стартовый нетерминал грамматики, <tex> p </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> |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)-грамматики.
Определение: |
Пусть где | — КС-грамматика. Рассмотрим возникновение следующей ситуации во время левостороннего вывода в этой грамматике слова :
TODO: LL(1)-грамматика
TODO: FIRST и FOLLOW, примеры (скобочные последовательности)
TODO: Теорема об LL(1)-грамматиках
TODO: Пара следствий
TODO: Какие-нибудь примеры