spoPresentation2
.pdfLL(k) - грамматики
Чем больше k, тем более сложные языки описывает грамматика. И тем более сложные распознаватели для них требуются
Распознаватели LL(k)-грамматик просматривают входную цепочку слева направо и строят левосторонний вывод, просматривая k символов входной цепочки
LL(k)-грамматики обеспечивают детерминированный нисходящий разбор
291
LL(k) - грамматики
КС-грамматика G называется LL(k)- грамматикой, если для любой цепочки ZАD V* и первых k терминальных символов, выводимых из подцепочки АD, существует
не более одной подстановки, которую можно применить к нетерминалу А, чтобы получить левый вывод цепочки, начинающийся с Z и продолжающийся k
терминальными символами
292
LL (k) - грамматики
|
S |
|
На основе левой части y |
|
|
|
дерева построена Z - уже |
||
|
|
|
||
|
A |
|
разобранная часть входной |
|
|
|
цепочки ZWD |
||
Z |
W |
D |
||
Правая часть дерева x – еще |
неразобранная часть
А – текущий нетерминал на вершине стека МП-автомата
После завершения вывода А раскрывается в часть входной цепочки W, а правая часть х в часть входной цепочки D
293
LL (k) - грамматики
|
S |
|
Однозначный выбор |
|
|
альтернативы для |
|
|
|
|
|
|
A |
|
нетерминала А может быть |
|
|
сделан на основе k первых |
|
|
|
|
|
Z |
W |
D |
символов цепочки WD, |
k |
являющейся частью |
|
входной цепочки |
||
|
294
LL(k) - грамматики
Основные свойства LL(k) грамматик:
любая LL(k)-грамматика для k>0 является однозначной
существует алгоритм, позволяющий проверить, является ли заданная грамматика LL(k)-грамматикой для строго определенного k
Все грамматики, допускающие разбор по методу рекурсивного спуска, являются подклассом LL(1) грамматик
295
LL(k) - грамматики
Основные свойства LL(k) грамматик:
не существует алгоритма проверки, является ли заданная КС-грамматика LL(k)-грамматикой для произвольного числа k
не существует алгоритма преобразования произвольной КСграмматики к виду LL(k) грамматики для некоторого k
296
LL(k) - грамматики
Для LL(k)-грамматики при k>1 вовсе не обязательно, чтобы все правые части правил грамматики для каждого нетерминального символа начинались с k различных терминальных символов
Грамматики, для которых все правые части правил для каждого нетерминального символа начинаются с k различных терминальных символов, называются строгие LL(k)-грамматики
297
LL(k) - грамматики
Для строгих LL(k) грамматик распознаватель строится очень просто, однако такие грамматики достаточно редко встречаются.
На практике широко применяются LL(1) грамматики
S-грамматики являются их подклассом
298
LL(k) - грамматики
В общем случае LL(1) грамматики накладывают менее жесткие ограничения по сравнению с S грамматиками
LL(1) грамматики допускают в правой части цепочки, начинающиеся с нетерминала, а также O-правила
LL(1)-грамматика не может содержать для любого нетерминального символа A N
правил, начинающихся с одного и того же терминального символа
299
LL(k) - грамматики
Множество направляющих цепочек DS(k,А,D) для правила АoD, А N, D V* определим как
DS(k,А,D) = S(k,D) F(k,А)
Здесь S(k,D) – множество цепочекпредшественников для строки D длины k,
определяемое как S(k,D)={E | E T*, |E|=k,
D V+, D *EJ, J V*}
Фактически это множество терминальных цепочек, выводимых из непустой строки D,
укороченных до k символов
300