- •Цели лексического анализа:
- •Основные функции лексического анализатора:
- •Общие принципы построения лексических анализаторов
- •Конечные автоматы
- •Преобразования нка
- •Задачи синтаксич анализа:
- •Роль синтаксического анализатора
- •Контекстно-свободные грамматики
- •Стековая реализация пс-анализа
- •Грамматики предшествования
- •Алгоритм синтаксического анализа простого предшествования
- •Алгоритм синтаксического анализа приоритета операторов
- •Нерекурсивный предиктивный анализ
- •Множества first и follow
- •Внутреннее представление программы
- •Способы внутреннего представления программ.
- •Триады – многоадресный код с неявно именуемым результатом.
- •Алгоритм преобразования дерева вывода в дерево операций:
- •Ассемблерный код и машинные команды
- •Синтаксически управляемые определения
- •Вид синтаксически управляемого определения
- •Восходящее выполнение s-атрибутных определений
- •Синтезируемые атрибуты в стеке синтаксического анализатора
- •Наследование атрибутов в стеке синтаксического анализатора
- •Замена наследуемых атрибутов синтезируемыми
Общие принципы построения лексических анализаторов
Лексический анализатор имеет дело с такими объектами, как различного рода константы и идентификаторы (к последним относятся и ключевые слова). Язык констант и идентификаторов в большинстве случаев является регулярным — то есть может быть описан с помощью регулярных грамматик. Распознавателями для регулярных языков являются конечные автоматы. Существуют правила, с помощью которых для любой регулярной грамматики может быть построен НКА, распознающий цепочки языка, заданного этой грамматикой. КА для каждой входной цепочки языка дает ответ на вопрос о том, принадлежит или нет цепочка языку, заданному автоматом.
В общем случае задача сканера несколько шире, чем просто проверка цепочки символов лексемы на соответствие ее входному языку. Кроме этого, сканер должен выполнить следующие действия:
четко определить границы лексемы, которые в исходном тексте явно не заданы;
выполнить действия для сохранения информации об обнаруженной лексеме (или выдать сообщение об ошибке, если лексема неверна).
Конечные автоматы
Распознавателем языка называется программа, кот получает на входе строку x и отвечает «да», если x – предложение языка, или в противном случае «нет». Регулярное выражение компилируется в распознаватель путем построения обобщенной диаграммы переходов, называемой конечным автоматом. Такой автомат может быть детерминированным или недетерминированным (недетерминированный автомат может иметь более одного перехода из состояния при одном и том же входном символе).
Недетерминированный конечный автомат A=(Q, V, δ, q0, F) представляет собой математическую модель, состоящую из
множества состояний Q;
множества входных символов V (символов входного алфавита);
функции переходов δ, которая отображает пары символ-состояние на множество состояний;
состояния q0, известного как стартовое (начальное);
множества состояний F, известных как допускающие (конечные);
НКА может использоваться в виде помеченного орграфа, так называемого графа переходов, узлы которого представляют собой состояния, а помеченные дуги составляют функцию переходов. Некоторые переходы могут быть помечены специальным символом , как обычным входным символом (-переходы).
Функция переходов НКА может быть реализована различными способами. Простейший из них — таблица переходов, в которой строки представляют состояния, а столбцы — входные символы. Запись в строке i для символа а является множеством состояний, которые могут быть достигнуты переходом из состояния i при входном символе а.
Детерминированный конечный автомат - спец. случай НКА, в котором
отсутствуют состояния, имеющие λ-переходы;
для каждого состояния s и входного символа а существует не более одной дуги, выходящей из s и помеченной как а.
ДКА имеет для любого входного символа не более одного перехода из каждого состояния. Если для представления функции переходов ДКА используется таблица, то каждая запись в ней представляет собой единственное состояние. Следовательно, очень просто проверить, допускает ли данный ДКА некоторую строку, поскольку имеется не более одного пути от стартового состояния, помеченный этой строкой.