Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК по СПО.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.79 Mб
Скачать

Порядок выполнения работы:

  1. Запустить MSVisualC++, создать приложение «Lexer and Parser AppWizard» (например, Example).

  2. Настроить входной поток: в функции main при создании парсера указать входной файл, в lex-файле (.l) заменить функцию getchar() на getc(yyin) (yy заменяется названием вашего проекта – Examplein).

  3. В lex-файле (.l) выделить необходимые лексемы (например, DIGIT).

  4. C помощью переменной yylval, которой присваивается приведенное (функции atoi, atof) значение лексемы и массива yytext передать парсеру значение выделенной лексемы.

  5. Определить тип лексем и их имена в разделе %token.

  6. В разделе %type указать тип и имена нетерминальных символов.

  7. В разделе %start указать имя начального символа.

  8. В разделе правил указать нетерминальные символы и действия над ними с учетом возможных ошибок данных (error).

  9. С помощью функции printf вывести результат на экран.

  10. Нажав правую клавишу миши и выбрав соответствующий пункт, откомпилировать lex-файл и запустить приложение.

Таблица 6 ─ Варианты заданий на лабораторную работу №3

Вариант

Необходимые операции

1

+, -, *, / ;

возведение в квадрат;

возведение в куб;

вычисление логарифма;

2

+, -, *, / ;

вычисление остатка от деления;

извелечение корня квадратного;

возведение в степень

3

+, -, *, / ;

вычисление модуля числа;

вычисление косинуса;

вычисление тангенса

4

+, -, *, / ;

операция целочисленного деления;

вычисление синуса;

вычисление котангенса

Контрольные вопросы

  1. Для чего необходим синтаксический анализатор?

  2. Как передать выделенную лексему синтаксическому анализатору Yacc?

  3. Опишите структуру Yacc-программы.

  4. Опишите назначение разделов %start, %type, %union, %token.

  5. Какую структуру имеет грамматическое правило?

  6. Что служит для взаимосвязи между действиями и процедурой разбора?

  7. Для чего служат ключевые слова yacc'а %left, %right или %nonassoc?

Лабораторная работа №4

Лексический анализатор lex и синтаксический анализатор yacc. Изображение геометрических фигур

Цель работы: освоить работу в MS VisualC++ с LEX и YACC. Изучить правила выделения лексем, задания правил. Ознакомиться с функциями рисования геометрических фигур и линий VisualC++.

Краткая теория:

Работа с графикой в VisualC++

При рисовании фигур в Visual C++ используются специальные объекты GDI, т.е. объекты интерфейса графического устройства (GDI - Graphics Device Interface) системы Windows.

Таблица 7 – Объекты GDI

Название

Класс

Тип определителя в Windows

Перо

CPen

HPEN

Кисть

CBrush

HBRUSH

Шрифт

CFont

HFONT

Растровое изображение

CBitmap

HBITMAP

Палитра

CPalette

HPALETTE

Область (регион)

CRgn

HRGN

Как и любые другие объекты в Visual C++, они должны быть созданы соответствующим образом. Создание объекта должно включать в себя и связывание с соответствующим объектом системы Windows. Эта операция осуществляется методом, имя которого начинается с префикса Create. Он может быть выполнен как после создания объекта Visual C++, так и в конструкторе объекта:

CPen Pen1;

Pen1.CreatePen(PS_DOT, 5, RGB(0,0,0)); // вариант 1

CPen Pen2(PS_DOT, 5, Rface="Courier New">GB(0,0,0)); // вариант 2

При завершении работы с объектом GDI необходимо обеспечить его автоматическое удаление при выходе из соответствующей области видимости.

Перо - объект для рисования линий. При создании пера можно задать его ширину, цвет и тип линии. Для создания пера используются метод CreatePen.

Кисть представляет собой растровое изображение размером 8х8 пикселей для заполнения различных областей.

Растровое изображение представляет собой объект, инкапсулирующий прямоугольную область, состоящую из пикселов. Создав такой объект, можно затем задавать в этой области любое изображение, а также считывать и записывать ее в файл и производить с ней другие действия.

Для создания палитры используются методы CreatePalette и CreateHalftonePalette. Созданную палитру можно изменить методом SetPaletteEntries.

Для установки цвета пикселя с логическими координатами (x,y) используются метод SetPixel. Получить значение цвета пикселя можно методом GetPixel.

Линии

Прежде, чем описывать методы для рисования линий, рассмотрим два важных для них атрибута контекста устройства.

Первый называют текущим пером. Если метод не содержит явного параметра, задающего перо, то для рисования берется текущее перо, которое можно установить методом SelectObject. Или, если в качестве параметра передать одну из констант BLACK_PEN, NULL_PEN, WHITE_PEN, то методом SelectStockObject

Второй атрибут - текущая позиция пера. Чтобы изменить координаты текущей позиции пера, используются метод MoveTo. После выполнения метода LineTo заданная в нем точка становится текущей позицией пера.

Если имеется массив точек и требуется соединить линией каждую следующую точку с предыдущей, можно использовать метод PolyLine, в котором первый параметр - указатель на массив элементов типа POINT, а второй равен количеству точек. При выполнении этого метода текущая позиция пера не изменяется.

Следующий метод аналогичен PolyLine за исключением того, что он устанавливает текущую позицию пера равной последней точке массива - PolyLineTo.

Если же требуется соединить между собой все точки, содержащиеся в массиве, можно вызвать метод PolyPolyline.

Фигуры

В Visual C++ имеются методы для рисования:

  • прямоугольника (Rectangle);

  • эллипса (Ellipse);

  • скругленного прямоугольника (RoundRect);

  • сегмента эллипса (Chord);

  • сектора эллипса (Pie);

  • замкнутого многоугольника; составного замкнутого многоугольника.

Для рисования фигур важен атрибут контекста устройства, называемый текущей кистью. Он задает кисть как объект GDI, с помощью которого производится закрашивание внутренней области фигуры. Текущая кисть устанавливается методом SelectObject или SelectStockObject, если в качестве параметра передать одну из констант: BLACK_BRUSH, DKGRAY_BRUSH, GRAY_BRUSH, HOLLOW_BRUSH, LTGRAY_BRUSH, NULL_BRUSH, WHITE_BRUSH.