
- •Содержание
- •1.Рабочая программа
- •2.Модуль Вводный
- •3.Модуль Формальные грамматики и языки
- •3.1.Языки и цепочки символов. Способы задания языков
- •3.1.1.Цепочки символов. Операции над цепочками символов
- •3.1.2.Понятие языка. Формальное определение языка
- •3.1.3.Способы задания языков
- •3.1.4.Синтаксис и семантика языка
- •3.2.Определение грамматики
- •3.2.1.Особенности языков программирования
- •3.2.2.Определение грамматики. Форма Бэкуса—Наура
- •3.2.3.Принцип рекурсии в правилах грамматики
- •3.2.4.Другие способы задания грамматик
- •3.3.Классификация языков и грамматик
- •3.3.1.Классификация грамматик
- •3.3.2.Классификация языков
- •3.4.Контроль
- •4.Модуль Распознаватели, механизм вывода цепочек символов
- •4.1.Цепочки вывода. Сентенциальная форма.
- •4.1.1.Сентенциальная форма грамматики. Язык, заданный грамматикой
- •4.1.2.Левосторонний и правосторонний выводы
- •4.1.3.Однозначные и неоднозначные грамматики
- •4.1.4.Эквивалентность и преобразование грамматик
- •4.2.Распознаватели. Задача разбора
- •4.2.1.Общая схема распознавателя
- •4.2.2.Виды распознавателей
- •4.2.3.Классификация распознавателей по типам языков
- •4.3.Контроль
- •5.Модуль Регулярные грамматики и языки
- •5.1.Регулярные языки и грамматики
- •5.2.Леволинейные и праволинейные грамматики. Автоматные грамматики
- •5.3.Алгоритм преобразования регулярной грамматики к автоматному виду
- •5.4.Конечные автоматы
- •5.4.1.Определение конечного автомата
- •5.4.2.Детерминированные и недетерминированные конечные автоматы
- •5.4.3.Преобразование конечного автомата к детерминированному виду
- •5.5.Контроль
- •6.Модуль Контекстно-свободные грамматики и языки
- •6.1.Контекстно-свободные языки
- •6.1.1.Распознаватели кс-языков. Автоматы с магазинной памятью. Определение мп-автомата
- •6.2.Классы кс-языков и грамматик. Класс ll(k) грамматик.
- •6.3.Принципы построения распознавателей для ll(k)-грамматик
- •6.4.Левая факторизация
- •6.5.Удаление левой рекурсии
- •6.6.Алгоритм разбора для ll(1)-грамматик
- •6.7.Алгоритм построения множества first(1,a)
- •6.8.Алгоритм построения множества follow(1,a)
- •6.9.Восходящие распознаватели кс-языков без возвратов
- •6.9.1.Определение lr(k)-грамматики
- •6.10.Принципы построения распознавателей для lr(k)-грамматик
- •6.10.1.Грамматики простого предшествования
- •6.11.Распознаватели для lr(0) и lr(1) грамматик
- •6.11.1.Распознаватель для lr(0)-грамматики
- •6.11.2.Распознаватель для lr(1) грамматики
- •6.12.Контроль
- •7.Модуль Инструментальные средства для построения трансляторов
- •7.1.Инструментальные средства для построения компиляторов
- •7.1.1.Построитель лексических анализаторов Lex
- •7.2.Контроль
- •8.Модуль Особенности программирование трансляторов
- •8.1.Использование значений произвольных типов, алгоритм разбора
- •8.1.1.Алгоритм синтаксического разбора
- •8.1.2.Семантический стек
- •8.2.Неоднозначности и конфликты
- •8.3.Старшинство операций
- •8.4.Дополнительные возможности программ yacc и lex
- •8.4.1.Обработка ошибок
- •8.5.Совместное использование lex и yacc
- •8.5.1.Кодировка лексем и интерфейс
- •8.5.2.Сборка yacc-программ
- •8.6.Советы по подготовке спецификаций
- •8.6.1.Стиль
- •8.6.2.Использование левой рекурсии
- •8.6.3.Уловки анализа лексики
- •8.6.4.Входной синтаксис yacc'а
- •8.7.Контроль
- •9.Модуль Заключение
- •10.Обеспечение лабораторного практикума
- •11.Дополнительная информация. Примеры
- •11.4.Пример простейшего интерпретатора формул
- •11.5.Простой пример
- •11.6.Более сложный пример
- •11.7.Генераторы лексических и синтаксических анализаторов
- •11.8.Генераторы лексических и синтаксических анализаторов на java
- •11.9.Пакеты для разработки компиляторов
- •Список сокращений
- •Литература
- •Приложения Приложение 1. Учебно–методическая карта дисциплины “Системное программное обеспечение. Синтаксические анализаторы”
- •Приложение 2. Вопросы для зачета по дисциплине “Системное программное обеспечение. Синтаксические анализаторы”
- •Приложение 3. Методические указания к лабораторным работам по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex. Анализ структуры программ
- •Краткая теория:
- •Рассмотрим примеры:
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex, синтаксический анализатор yacc. Алгебраические вычисления
- •Краткая теория:
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Лексический анализатор lex и синтаксический анализатор yacc. Изображение геометрических фигур
- •Краткая теория:
- •Создание метафайла и работа сним
- •Порядок выполнения работы:
- •Контрольные вопросы
- •Приложение 4. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
Порядок выполнения работы:
Запустить BorlandC++Builder, создать приложение.
Согласно выбранному заданию написать программу.
Результат вывести на экран с помощью потоковых функций.
Таблица 4 ─ Варианты заданий на лабораторную работу №1
Задание |
Вариант |
Прочитать текст из файла, и вывести его следующим образом: Каждое число на отдельной строке в десятичном виде с точностью 2 цифры после запятой и полем в 10 символов, причем числа, начинающиеся с 0 рассматривать как восьмеричные, а числа, заканчивающиеся на Н, рассматривать как шестнадцатеричные, все остальные – десятичные; После нахождения символа “!” начинать выводить текст с новой строки; |
1 |
Прочитать текст из файла. Данные при этом могут быть представлены некорректно: возможно использование множества пробелов, переводов строк, знаков табуляций в любом месте до, после и внутри скобок, задающих координаты геометрических фигур. Требуется корректно разобрать текст, удаляя лишние символы и вывести каждый новый элемент на отдельной строке. Формат, задающий вид и координаты фигур, следующий: Line(x1, y1, x2, y2) Circle(x, y, r) Ellipse(x1, y1, x2, y2) Rectangle(x1, y1, x2, y2) |
2 |
Контрольные вопросы
Опишите алгоритм работы программы.
Какие функции для ее написания Вы использовали?
Какие потоковые классы Вы знаете?
Какие флаги для форматирования данных при вводе-выводе Вы знаете?
Какие объекты потоковых классов Вы знаете?
Лабораторная работа №2
Лексический анализатор lex. Анализ структуры программ
Цель работы: освоить работу в MS VisualC++ с лексическим анализатором LEX. Изучить правила выделения лексем. Ознакомиться с правилами форматирования текстов различных языков программирования.
Краткая теория:
Любой текст, написанный на каком-либо языке, имеет свою структуру. Часто для анализа содержимого этого текста необходимо иметь его древовидное логическое представление.
Так текст:
if(…){…} else {if(…){…}if(…)else…}
корректно было бы представить в виде:
if(…){
…
}
else{
if(…){
…
}
if(…)…
else …
}
Такое представление информации помогает простому восприятию текста, пониманию, упрощает процедуру коррекции. Из этого следует необходимость в определенном дизайне(стиле) программных текстов.
Рассмотрим несколько особенностей стилей написания программ на языках C++, Pascal, HTML.
C++
Помещайте на отдельных строках:
вызов функций;
закрывающую скобку (});
операцию присвоения;
объявление переменных одного типа;
заголовок функции
циклы и оператор if и т.д.
Используйте отступы для выделения циклов, методов и их тел, для действий внутри блоков {…}.
Рассмотрим пример:
void CTreeTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CT::iterator it=t.root();
CT::iterator ins=t.root();
double min=10000,cur;
while(it!=t.end()){
CPoint p=(*it).p;
cur=sqrt(pow((double)(point.x-p.x),2)+pow((double)(point.y-p.y),2));
if(min>cur){
min=cur;
ins=it;
}
it++;
}
ctti.p=point;
t.append(ins,ctti);
Invalidate(true);
}
TurboPascal
Пишите заголовки тела программы (BEGIN, END), области определения переменных прописными буквами (VAR), а вложенные блоки – строчными, начиная со строчной (Begin, End)(необязательно).
Помещайте каждое новое действие на отдельных строках.
Используйте отступы для выделения циклов, процедур, функций и их тел.
Зарезервированные слова Begin, End пишите на отдельной строке на уровне последнего оператора, а вложенные операторы располагайте на новой строке на расстоянии двух пробелов.
Рассмотрим пример:
PROGRAM traveling_salesperson ;
CONST
…
TYPE
…
VAR
…
FUNCTION tanh(r : real) : real ;
VAR
r1,r2 : real ;
Begin
IF r > 20.0
THEN tanh := 1.0
ELSE IF r < -20.0
THEN tanh := -1.0
ELSE
BEGIN
r1 := exp(r) ;
r2 := exp(-r) ;
tanh := (r1 - r2) / (r1 + r2) ;
END ;
END ; (* tanh *)
PROCEDURE initialize ;
TYPE
…
CONST
…
VAR
…
BEGIN
randomize ;
FOR … TO … DO
BEGIN
…
END ;
FOR … TO … DO
BEGIN
…
FOR … TO … DO
BEGIN
…
END ;
END ;
writeln(…) ;
END ;
BEGIN
initialize ;
iterate ;
END.
HTML
Начинайте с новой строки следующие теги:
открытия таблицы <Table>;
открытия новой строки и нового столбца в таблице <tr><td>;
теги < Html><Meta><Title><Head>;
открытия новой строки в списке <UL><LI><OL>;
абзаца и отдельно стоящего рисунка <P><IMG>;
установки нового фрейма и т.д.<FrameSet>
Отделяйте отступами от начала строки:
строки и столбцы в таблицах;
вложенные фреймы;
строки в списках и др.