
- •Компиляция. Основные понятия. Контекст компилятора
- •Этапы, фазы и проходы
- •Фаза анализа. Основные понятия.
- •Фаза синтеза. Основные понятия.
- •Методы определения языка
- •Понятие регулярных выражений
- •Понятие грамматики
- •8.Иерархия грамматик по Хомскому
- •9 . Порождения синтаксические деревья
- •Неоднозначность
- •11.Понятие лексического анализа
- •12.Лексический анализ с помощью регулярных выражений
- •Лексический анализ с помощью конечных автоматов
- •14. Лексический анализ с помощью Lex
- •15. Нисходящий анализ. Критерии принятия решений.
- •16. Понятие ll(1)-грамматики
- •17. Рекурсивный спуск. Расширенная форма записи правил для исключения рекурсивных вызовов.
- •18. Рекурсивный спуск. Комбинирование рекурсии и итерации.
- •19. Преобразование грамматик. Удаление левой рекурсии
- •20. Преобразование грамматик. Факторизация
- •21. Введение действий в грамматику
- •22. Восходящий синтаксический анализ. Основные понятия. Критерий принятия решений
- •Восходящий синтаксический анализ. Таблица синтаксического анализа.
- •25. Характеристический конечный автомат.
- •Восходящий синтаксический анализ. Slr(1), lalr(1), общий алгоритм формирования таблицы lr(1)-анализа.
- •Восходящий синтаксический анализ. Генератор восходящих анализаторов yacc. Основные понятия.
- •Семантический анализ. Не-контекстно-свободные характеристики языков.
- •Семантический анализ. Таблица символов.
- •Семантический анализ. Таблица типов.
- •31.Семантический анализ. Таблицы функций. Таблицы меток
- •32. Распределение памяти. Классификация памяти
- •33. Распределение памяти. Стек времени выполнения. Определение области видимости.
- •34. Распределение памяти. Стековый фрейм.
- •35. Распределение памяти. Дисплей.
- •35. Адреса времени компиляции. Простые адреса. Адресация элементов статического массива.
- •37. Распределение памяти. Адреса времени компиляции. Адреса динамического массива
- •38. Куча. Основные понятия. Методы автоматического освобождения памяти.
Лексический анализ с помощью конечных автоматов
Вместо регулярных выражений можно использовать соответствующий конечный автомат. Конечный автомат состоит из конечного множества состояний и переходов между ними, которые определяются считываемыми знаками из входной строки. При этом одно состояние определяется как начальное, а одно или более состояний — как конечные. Считается, что конечный автомат принял входную строку, если, начав работу с начального состояния и выполнив соответствующие переходы при считывании каждого знака исходной строки, автомат переходит в конечное состояние, когда
строка полностью считана. Или другими словами Конечный автомат используется при написании программы с помощью регулярных выражений. Конечный автомат состоит из конечного множества состояний и переходов между ними, которые определяются считываемыми знаками между ними, которые определяются считываемыми знаками из входной строки.
Конченый автомат определяется как следующая пятерка элементов.
П
ереходы
δ
можно определить как таблицу (или
графически), и они для каждого состояния
будут указывать следующее
состояние
и все возможные входные знаки.
Действительное число можно представить с помощью приведенного ниже конечного автомата ==========================>
14. Лексический анализ с помощью Lex
Конструирование устройств распознавания символов из регулярных выражений или конечных автоматов, принимающих эти выражения может быть легко автоматизировано с помощью инструментальных средств, таких как Lex. Форма записи Lex допускает более эффективное представление (с точки зрения числа знаков, используемых в представлении) некоторых типов символов. Форма записи Lex расширяет выразительную силу обозначений регулярных выражений. Letter и digit являются определениями в Lex. Если какое-то действие должно выполняться всякий раз, когда встречается идентификатор, то оно выражается в виде правила {identifier} {printf («идентификатор опознан\n») ;} полным входом для создания анализатора, распознающего идентификаторы имеет следующий код
letter [a-z]
digit [0-9]
identifier {letter} ( {letter}| {digit} )*
%%
{identifier} {printf («идентификатор опознан\n») ;}
%%
Если этот код содержится в файле firstlex.l, тогда анализатор создается с помощью следующей команды lex firstlex.l Результатом данной команды будет написанный на С анализатор, помещаемый в файл lex.yy.c далее его можно откомпилировать cc –o firstlex lex.yy.c –ll и поместить целевой код в файл firstlex. Общий вид входа, ожидаемого Lex:
определения
%%
правила
%%
пользовательские функции
перед знаками ввода, которые являются частью системы обозначений («-» и «.») необходимо употреблять знак «\». Знак «+» используется для указания, что предшествующий знак один или более раз. Основные свойства обозначений, используемых на входе Lex: а- представляет отдельный знак; \а- представляет а, если а-знак, используемый в системе обозначений; «а»- также представляет а, если а-знак,используемый в системе обозначений; а|b – предстваляет а или b; а?- представляет нуль или одно вхождение а; а*- представляет а или более вхождений а; а+ - представляет одно или более вхождений а; а (m,n)- представляет от m до n вхождений а; [а-z]- представляет набор знаков (алфавит); [a-zA-Z]- представляет набор знаков; [^a-z]- представляет дополнение первого набора знаков; {name}- представляет регулярное выражение, определенное идентификатором name; ^a- представляет а в начале строки; a$- представляет а в конце строки; ab\xy – представляет ab, следующее перед xy. Типы анализа, связанные с лексической структурой программы: идентификация слов языка, идентификация и вычисление констант, определение всех отдельных идентификаторов программ, определение числа строк комментариев в программе, определение числа и средней длины литералов в программе.