Добавил:
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. В yacc-файле (.y) в разделе правил оставить строчку (YACC должен только вызывать LEX):

  4. rule1: {}

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

  6. Используя метки, проанализировать структуру текста.

  7. С помощью функции printf или ECHO вывести необходимые данные на экран.

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

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

Язык

Вариант

C++

1

Pascal

2

HTML

3

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

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

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

  3. Опишите назначение операторов \, ^, ?, *, +, |, $, /, %, [], {}, ., (), <>.

  4. Для чего используются операторы START и BEGIN?

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

  6. Какая функция заменяет printf в Lex программах?

  7. Какие правила используются для решения проблемы, когда одна цепочка символов удовлетворяет нескольким правилам?

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

Лексический анализатор lex, синтаксический анализатор yacc. Алгебраические вычисления

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

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

Для совместной работы Lex и Yacc используется также внешний массив символов, который формирует lex – yytext.

Вся необходимая дополнительная информация приводится в пунктах 11.1, 11.2, 11.3 настоящего УМК.

Рассмотрим пример:

calc.l

calc.y

%{

#include <stdlib.h>

#include "calc.cpp.h"

#undef YY_INPUT

#define YY_INPUT(buf,result,max_size) \

{ \

int c = getc(calcin); \

result = (c == EOF) ? \

YY_NULL :

(buf[0] = c, 1); \

}

%}

%%

[ \t\n] ;

[0-9][0-9]* {

calclval.integer_type =

atoi(calctext); return NUM;

}

. return calctext[0];

%%

%{

#include <iostream.h>

extern int calcerror(const char* s);

extern int calclex();

extern int result;

%}

%union

{

int integer_type;

}

%left '+', '-'

%left '*', '/'

%token <integer_type> NUM

%type <integer_type> formula, exp

%start formula

%%

formula: NUM {$$=$1;result=$1;}

| exp {$$=$1;result=$1;}

;

exp: '(' exp ')' {$$=$2;}

| exp '+' exp {$$=$1+$3;}

| exp '-' exp {$$=$1-$3;}

| exp '*' exp {$$=$1*$3;}

| exp '/' exp {$$=$1/$3;}

| '-' exp {$$=-$2;}

| NUM {$$=$1;}

;

%%

/* programs */

extern "C"

{

int

calcwrap()

{

return 1;

}

}

int

calcerror(const char *s)

{

cerr << "Syntax error: " << s << endl;

return 0;

}

Данная программа выполняет функцию простейшего калькулятора, подсчитывая значение выражения из файла. Функция main будет выглядеть следующим образом:

#include "calcParser.h"

#include<stdio.h>

#include<stdlib.h>

int result=0;

char str[1000];

int main(int argc, char** argv) {

calcParser parser("formula.txt");

parser.Parse();

printf("\n\nresult = %d\n\n",result);

return 0;

}

Задания:

Задача состоит в нахождении значения алгебраического выражения (усовершенствованный калькулятор). В выражении могут использоваться четыре знака операций: +, -, *, / и некоторые простейшие функции: косинус, синус, тангенс, логарифм и др. Также в выражении могут использоваться скобки любой вложенности. Числа могут быть представлены в виде десятичной дроби и экспонентциальной форме, могут быть отрицательными. Требуется корректно разобрать выражение с использованием анализаторов LEX и YACC и вычислить результат. Данные при этом могут быть записаны с использованием знаков пробелов, табуляций, переводов строк.

Само выражение читается из входного файла, результат вычисления выводится на экран.