ВУЗ:
Составители:
50
9. ПРЕОБРАЗОВАНИЕ ГРАММАТИК В LL(1) ФОРМУ
"Очевидной" грамматикой для большинства языков программирования
является не LL(1)-грамматика. Однако обычно очень большое число
контекстно-свободных средств языка программирования можно представить
с помощью LL(1)-грамматики. Проблема заключается в том, чтобы, имея
грамматику, которая не обладает признаком LL(1), найти эквивалентную ей
LL(1)-грамматику. Не существует универсального алгоритма преобразования
любой КС-грамматики в LL(1) форму (а
также определения самой
возможности такого преобразования). Однако существует ряд приемов,
позволяющих выполнить такое преобразование во многих частных случаях.
Устранение левой рекурсии
Грамматика, содержащая левую рекурсию, не является LL(1)-
грамматикой. Рассмотрим правила
A
→
Aa (левая рекурсия в A)
A
→
a
Здесь a символ-предшественник для обоих вариантов нетерминала A.
Аналогично грамматика, содержащая левый рекурсивный цикл, не может
быть LL(1)-грамматикой, например
A
→
BC
B
→
CD
C
→
AE
Грамматику, содержащую левый рекурсивный цикл, можно
преобразовать в грамматику, содержащую только прямую левую рекурсию, и
далее, за счет введения дополнительных нетерминалов, левую рекурсию
можно исключить полностью (в действительности она заменяется правой
рекурсией, которая не представляет проблемы в отношении LL(1)-свойства).
В качестве примера рассмотрим грамматику с порождающими правилами
50
9. ПРЕОБРАЗОВАНИЕ ГРАММАТИК В LL(1) ФОРМУ
"Очевидной" грамматикой для большинства языков программирования
является не LL(1)-грамматика. Однако обычно очень большое число
контекстно-свободных средств языка программирования можно представить
с помощью LL(1)-грамматики. Проблема заключается в том, чтобы, имея
грамматику, которая не обладает признаком LL(1), найти эквивалентную ей
LL(1)-грамматику. Не существует универсального алгоритма преобразования
любой КС-грамматики в LL(1) форму (а также определения самой
возможности такого преобразования). Однако существует ряд приемов,
позволяющих выполнить такое преобразование во многих частных случаях.
Устранение левой рекурсии
Грамматика, содержащая левую рекурсию, не является LL(1)-
грамматикой. Рассмотрим правила
A → Aa (левая рекурсия в A)
A→ a
Здесь a символ-предшественник для обоих вариантов нетерминала A.
Аналогично грамматика, содержащая левый рекурсивный цикл, не может
быть LL(1)-грамматикой, например
A→ BC
B → CD
C → AE
Грамматику, содержащую левый рекурсивный цикл, можно
преобразовать в грамматику, содержащую только прямую левую рекурсию, и
далее, за счет введения дополнительных нетерминалов, левую рекурсию
можно исключить полностью (в действительности она заменяется правой
рекурсией, которая не представляет проблемы в отношении LL(1)-свойства).
В качестве примера рассмотрим грамматику с порождающими правилами
Страницы
- « первая
- ‹ предыдущая
- …
- 48
- 49
- 50
- 51
- 52
- …
- следующая ›
- последняя »
