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: Пара следствий