
- •3. Классификация языков по н. Хомскому.
- •4. Нотация Бэкуса-Наура
- •6. Дерево вывода. Левосторонний и правосторонний выводы
- •Пример построения Деревьев
- •Синтаксический анализ кс-языков
- •7. Однозначные и неоднозначные грамматики.
- •8. Основные понятия, связанные с процессами трансляции
- •9. Этапы и фазы процесса трансляции. Характеристики основных этапов
- •10. Цепочки символов. Понятие лексемы. Задачи лексического анализатора
- •11. Лексический анализ с помощью конечных автоматов
- •12. Алгоритм построения детерминированного конечного автомата по недетерминированному конечному автомату
- •14. Нормальная форма Хомского
- •16. Построение дерева синтаксического разбора.
- •17. Нисходящий синтаксический анализ
- •18. Ll(1) – грамматики
- •19. Восходящий синтаксический анализ
- •20. Таблицы транслятора
- •21. Организация таблиц символов компилятора
- •22. Основные элементы, требующие память во время выполнения.
- •23. Механизмы распределения памяти.
- •24. Стековое управление памятью.
- •25. Статическое управление памятью.
- •26. Управление кучей.
- •27. Сборка мусора.
Пример построения Деревьев
Процесс генерации цепочки аналогичен построению следующего дерева (все знают, кто такие деревья?):
- Корень - S
- При применении правила, заменяющего нетерминал X на цепочку y1y2...yn, в дерево добавляются узлы y1y2...yn, они становятся детьми узла, содержащего X.
В результате:
- Крона (узлы, не имеющие детей) дерева - текущее состояние цепочки
- К концу генерации в листьях находятся только нетерминалы и символы "пустая строка"
- По дереву невозможно восстановить последовательность применения правил в разных ветках. Впрочем, этот порядок ни на что и не влияет.
- Но вот каждую ветку можно восстановить точно
Вот так выглядят деревья для примеров из предыдущего пункта:
S
/---|---\
a S b
|
/---|---\
a S b
|
''
и
S
|
E
|
/-----|-----\
E + E
| |
M M
| |
/--|--\ /---|---\
M * M '(' E ')'
| | |
a a M
|
b
В общем, идея должна быть ясна.
В качестве примечания: соответствие дерево --> цепочка всегда однозначно, дерево точно определяет цепочку. А вот соответствие цепочка --> дерево - не всегда. Например, в приведённой выше грамматике цепочку a+b+a можно получить двумя способами:
S S
| |
E E
| |
/-----|-----\ /-----|-----\
E + E E + E
| | | |
M /---|---\ /---|---\ M
| E + E E + E |
a | | | | a
M M M M
| | | |
b a a b
Отличия кажутся незначительными.. До тех пор, пока '+' обозначает ассоциативную операцию, т.е. пока (a+b)+a = a+(b+a) В некоторых случаях это не верно даже для обычного плюса. Ещё смешнее получается, если заменить '+' на '-'. Неоднозначность может быть свойством грамматики, а может быть свойством языка. В первом случае существует однозначная КС-грамматика, описывающая тот же язык.
Синтаксический анализ кс-языков
Вот, наконец, и постановка задачи. Пусть есть КС-грамматика и какая-то цепочка.
- Задача минимум - определить, что цепочка принадлежит языку, описываемому грамматикой. Т.е. что существует такая последовательность применений правил этой грамматики, что из S можно сделать нужную цепочку.
- Задача максимум - построить дерево (вот так причудливо смешались в одно три цели: построить дом, посадить дерево, воспитать сына..).
Задача минимум, конечно, никому обычно не нужна. Строить дерево тоже не всегда нужно, часто дерево достаточно некоторым образом обойти и что-то при этом сделать. Например, в случае с арифметическими операциями - вычислить результат. Но по сути это одно и то же: раз можем обойти, то можем и построить.