
- •Компиляция. Основные понятия. Контекст компилятора
- •Этапы, фазы и проходы
- •Фаза анализа. Основные понятия.
- •Фаза синтеза. Основные понятия.
- •Методы определения языка
- •Понятие регулярных выражений
- •Понятие грамматики
- •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. Куча. Основные понятия. Методы автоматического освобождения памяти.
Неоднозначность
Для многих грамматик любому предложению, которое можно сгенерировать, соответствует единственное синтаксическое дерево, а также единственное правое или левое порождение. Фактически, эти три условия эквивалентны: из любого из них следуют два других. Иными словами, если одно из следующих утверждений справедливо, то справедливы и остальные.
Каждое сгенерированное грамматикой предложение имеет единственное левое порождение.
Каждое сгенерированное грамматикой предложение имеет единственное правое порождение.
Каждое сгенерированное грамматикой предложение имеет единственное синтаксическое дерево.
Г
рамматики,
для которых справедливы вышеуказанные
утверждения, называются однозначными
(unambiguous).
В противном случае грамматика является
неоднозначной
(ambiguous).
Если все грамматики, генерирующие язык,
являются неоднозначными, язык также
называют неоднозначным.
11.Понятие лексического анализа
Лексический анализ — основные функции которой состоят в группировке последовательностей знаков исходного кода в символы языка.
На этапе лексического анализа происходит формирование языковых символов из последовательностей знаков. В языке С содержится 6 типов символов: ключевые слова (const, char, if,else), идентификаторы (sum, main, printf), константы (27, 3.14 ,017(восьмеричная система), строковые литералы («Katherine»), операторы (+,--,++,-), знаки пунктуации , {,] , ; каждый из этих типов символов формируется лексическим анализатором в процессе лексического анализа. Процесс создания лексического анализатора достаточно легко автоматизируется, а инструментальные средства для его создания на основе регулярных грамматик всегда доступны. Лексический анализатор выполняет задачи: удаление комментариев, введение номеров строк, вычисление констант.
12.Лексический анализ с помощью регулярных выражений
Благодаря сравнительно простой природе символов, их всегда можно представить с помощью регулярных выражений или, эквивалентно, грамматик 3-го типа. Процесс создания лексического анализатора легко автоматизируется, а инструментальные средства для его создания на основе регулярных грамматик (или регулярных выражений) всегда доступны.
Помимо распознавания символов языка, лексический анализатор также выполняет некоторые другие задачи.
Удаление комментариев.
Введение номеров строк.
Вычисление констант.
Впрочем, существуют аргументы за то, чтобы последнюю задачу выполнял машинно-зависимый постпроцессор компилятора.
Лексический анализатор всего лишь распознает символы языка для передачи их синтаксическому анализатору. Порядок следования символов для него абсолютно не важен. const char typedef >> + Каждый отдельный символ полностью корректен. То, что данная последовательность не составляет начала (или хотя бы фрагмента) какой-либо программы, должно быть обнаружено синтаксическим анализатором.
Для лексического анализа регулярные выражения представляют собой удобный метод представления символов, таких как идентификаторы и константы. Например, идентификатор может быть представлен следующим образом.
letter (letter | digit)*
Подобным образом можно представить и действительное число.
(+| ‒)digit*.digit digit*