
- •Содержание
- •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. Организация рейтингового контроля по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»
10.Обеспечение лабораторного практикума
Лабораторный практикум проводится по соответствующим методическим указаниям и предназначен, в основном, для формирования навыков объектно-ориентированного программирования, изучения типовых программных решений для объектно-ориентированных программ и существующих программных заделов. Методические указания приведены в приложении (Приложение 3. Методические указания к лабораторным работам по дисциплине «Системное программное обеспечение. Синтаксические анализаторы»).
Защита лабораторных работ представляет собой одну из форм текущего контроля успеваемости по данному курсу. Распределение защит лабораторных работ во времени показано в приложении (Приложение 1. Учебно–методическая карта дисциплины “Системное программное обеспечение. Синтаксические анализаторы”).
11.Дополнительная информация. Примеры
11.1.Функции работы со строками языка С/С++ для С, MS Visual C++, Borland C++ Builder
Рассмотрим функции на примерах:
MS Visual C++
CString str,mid;
int i;
str="aa dddf hjjh (555) jhjhj jhgjh";
i=str.Find("aa",0);
i=str.Find("555",0);
if(i!=-1){
mid=str.Mid(i,3);
str.Delete(i,3);
str.Insert(i,'_');
MessageBox(str.GetBuffer(1),mid.GetBuffer(1));
}
str.Empty();
Borland C++ Builder
AnsiString as="aa dd (555) jjkk",mid;
int i=0;
i=as.Pos("555");
if(i){
mid=as.SubString(i,3);
as.Delete(i,3);
as.Insert("777",i);
i=as.LastDelimiter(". ");
MessageBox(NULL,as.c_str(),mid.c_str(),0);
}
11.2.Функции работы с потоками языка С / С++
Класс basic_ostream предоставляет функции, которые предназначены для форматирования и вывода символьных последовательностей посредством потокового буфера.
Поддерживаются две группы функций, а именно форматированного и неформатированного вывода. Обе группы функций отсылают символы посредством функций класса basic_streambuf. Форматирующие функции выполняют преобразование скалярных значений в строку и затем выполняют вывод.
//
// Пример 1
//
#include<iostream>
#include<ostream>
#include<sstream>
#include<iomanip>
void main ( )
{
using namespace std;
float f=3.14159;
int i=22;
const char* s="Randy is the king of stdlib";
// создадим объект istringstream для типа char
istringstream in( ios_base::in | ios_base::out );
// свяжем объект ostream с istringstream объектом
ostream out(in.rdbuf());
out << "test beginning !" << endl;
// выведем i в шестнадцатиричном формате
out << hex << i <<endl;
// установим ширину поля в 10
// установим символ '@' заполнителем поля
// и выведем i в десятичном формате
out << setw(10) << oct << setfill('@') << i << endl;
// установим точность в 2 цифры после запятой
// выведем f
out << setprecision(3) << f << endl;
// выведем 17 первых символов строки s
out.write(s,17);
// перевод строки
out.put('\n');
// выведем s
out << s << endl;
// выведем на экран полученный буфер
cout << in.rdbuf();
}
Класс basic_istream предоставляет функции, которые предназначены для форматирования и ввода символьных последовательностей посредством потокового буфера.
Также поддерживаются две группы функций, а именно форматированного и неформатированного ввода.
//
// Пример 2
//
#include<iostream>
#include<istream>
#include<fstream>
void main ( )
{
using namespace std;
float f= 3.14159;
int i= 3;
char s[200];
// открытие файла для вывода
ofstream out("example", ios_base::in | ios_base::out
| ios_base::trunc);
// связывание istream объекта с ofstream буфером
istream in (out.rdbuf());
// вывод в файл
out << "Annie is the Queen of porting" << endl;
out << f << endl;
out << i << endl;
// перемещение файлового указателя на начало
in.seekg(0);
f = i = 0;
// чтение из файла функциями с форматированием
in >> s >> f >> i;
// перемещение файлового указателя на начало
in.seekg(0,ios_base::beg);
// вывод всего файла на экран
cout << in.rdbuf();
// перемещение файлового указателя на начало
in.seekg(0);
// чтение первой строки файла
// "Annie is the Queen of porting"
in.getline(s,100);
cout << s << endl;
// чтение следующей строки файла
// 3.14159
in.getline(s,100);
cout << s << endl;
// перемещение файлового указателя на начало
in.seekg(0);
// читает первую строку файла (разделитель '\n')
// "Annie is the Queen of porting"
in.get(s,100);
// удаление перевода строки
in.ignore();
cout << s << endl;
in.get(s,100);
cout << s << endl;
in.ignore();
// сохранение позиции в переменной
istream::pos_type position = in.tellg();
// установить указатель в сохраненную позицию
in.seekg(position);
cout << "\n\n\n" << flush;
}
11.3.Функции работы с потоками в Borland C++ Builder
Этот пример показывает, как используются потоки для технологии VCL
AnsiString ComponentToString(TComponent c)
{
AnsiString as;
TMemoryStream* pms = new TMemoryStream();
TStringStream* pss = new TStringStream(as);
try
{
pms->WriteComponent(&c);
pms->Seek(0, soFromBeginning);
ObjectBinaryToText(pms, pss);
pss->Seek(0, soFromBeginning);
as = pss->DataString;
}
catch(...) {
ShowMessage("Streaming error.");
}
delete pms;
delete pss;
return as;
}
TComponent StringToComponent(AnsiString as){
TMemoryStream* pms = new TMemoryStream();
TStringStream* pss = new TStringStream(as);
TComponent *pc;
try {
ObjectTextToBinary(pss, pms);
pms->Seek(0, soFromBeginning);
}
catch(...) {
ShowMessage("Streaming error.");
}
pc = pms->ReadComponent(NULL);
delete pms;
delete pss;
return *pc;
}