LL(k)-грамматики, множества FIRST и FOLLOW — различия между версиями
Shersh (обсуждение | вклад) м (→LL(k)-грамматика) |
Shersh (обсуждение | вклад) (→FIRST и FOLLOW: добавлены примеры) |
||
Строка 34: | Строка 34: | ||
Другими словами, <tex> \mathrm{FIRST}(\alpha) </tex> {{---}} все символы (терминалы), с которых могут начинаться всевозможные выводы из <tex> \alpha </tex>, а <tex> \mathrm{FOLLOW}(A) </tex> {{---}} всевозможные символы, которые встречаются после нетерминала <tex> A </tex> во всех правилах грамматики. | Другими словами, <tex> \mathrm{FIRST}(\alpha) </tex> {{---}} все символы (терминалы), с которых могут начинаться всевозможные выводы из <tex> \alpha </tex>, а <tex> \mathrm{FOLLOW}(A) </tex> {{---}} всевозможные символы, которые встречаются после нетерминала <tex> A </tex> во всех правилах грамматики. | ||
=== Примеры === | === Примеры === | ||
− | {{ | + | Множества <tex> \mathrm{FIRST} </tex> и <tex> \mathrm{FOLLOW} </tex> могут отличаться даже для одной грамматики, если она задана разными правилами. Рассмотрим пример двух различных грамматик для языка правильных скобочных последовательностей. |
+ | |||
+ | * <tex> A \rightarrow (A)A \mid \varepsilon </tex> | ||
+ | * <tex> B \rightarrow BB \mid (B) \mid \varepsilon </tex> | ||
+ | |||
+ | |||
+ | {| style="background-color:#CCC;margin:0.5px" | ||
+ | !style="background-color:#EEE"| Правило | ||
+ | !style="background-color:#EEE"| FIRST | ||
+ | !style="background-color:#EEE"| FOLLOW | ||
+ | |- | ||
+ | |style="background-color:#FFF;padding:2px 30px"| A | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>\{\ (,\ \varepsilon\ \} </tex> | ||
+ | |style="background-color:#FFF;padding:2px 40px"| <tex>\{\ ),\ \$\ \} </tex> | ||
+ | |- | ||
+ | |style="background-color:#FFF;padding:2px 30px"| B | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>\{\ (,\ \varepsilon\ \} </tex> | ||
+ | |style="background-color:#FFF;padding:2px 30px"| <tex>\{\ (,\ ),\ \$\ \} </tex> | ||
+ | |} | ||
== Теорема о связи LL(1)-грамматики с множествами FIRST и FOLLOW == | == Теорема о связи LL(1)-грамматики с множествами FIRST и FOLLOW == |
Версия 12:25, 28 июня 2014
Наибольший интерес в построении синтаксических анализаторов (парсеров) представляют LL(1)-грамматики, так как для них возможно построение нисходящих парсеров без возврата, то есть без корректировки выбранных правил в грамматике. LL(1)-грамматики являются подмножеством КС-грамматик. Однако для достаточно большого количества формальных языков можно построить LL(1)-грамматику, например, для языка арифметических выражений и даже для некоторых языков программирования, в частности можно и для языка Java.
Содержание
LL(k)-грамматика
Дадим теперь формально определение LL(k)-грамматики.
Определение: |
Пусть где | — КС-грамматика. Рассмотрим два произвольных левосторонних вывода слова в этой грамматике:
LL(1)-грамматика является частным случаем. Её определение почти такое же, только вместо строки
один символ .Неформально это означает, что, посмотрев на очередной символ после уже выведенной части слова, можно однозначно определить, какое правило из грамматики выбрать.
FIRST и FOLLOW
Ключевую роль в построении парсеров для LL(1)-грамматик играю множества
и .Пусть
— символ из алфавита , — строки из нетерминалов и терминалов (возможно пустые), — нетерминалы грамматики (начальный и произвольный соответственно), — символ окончания слова. Тогда определим и следующим образом:Определение: |
Определение: |
Другими словами,
— все символы (терминалы), с которых могут начинаться всевозможные выводы из , а — всевозможные символы, которые встречаются после нетерминала во всех правилах грамматики.Примеры
Множества
и могут отличаться даже для одной грамматики, если она задана разными правилами. Рассмотрим пример двух различных грамматик для языка правильных скобочных последовательностей.
Правило | FIRST | FOLLOW |
---|---|---|
A | ||
B |
Теорема о связи LL(1)-грамматики с множествами FIRST и FOLLOW
TODO: Теорема об LL(1)-грамматиках
TODO: Пара следствий