Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SI.doc
Скачиваний:
25
Добавлен:
23.02.2015
Размер:
2.05 Mб
Скачать

Синтаксический анализатор

Цель: закрепление на практике знаний работы с синтаксическим анализатором.

Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа одного разобранного задания.

Самостоятельная работа не предусмотрена.

Обязательное зачетное задание.

Необходимый уровень знаний:

  • работа с функциями;

  • работа с указателем;

  • механизм рекурсии.

Задача

Построить синтаксический анализатор для понятия «формула».

формула ::= цифра формула знак формула

знак ::= +

цифра ::= 0|1|2|3|4|5|6|7|8|9

#include<stdio.h>

#include <stdlib.h>

// длина вводимой строки

#define L 1024

// состояние анализатора

// стартовое

#define START 0

// встретилась цифра

#define DIGIT 1

// встретился знак

#defineSIGN2

// ввод строки

void inputstring(char* sym)

{ charch;

//до тех пор, пока не встретился знак пробела

do

{

// чтение очередного символа

ch=getchar();

// добавление символа в строку

*sym=ch;

// наращивание

sym++;

}

while (ch != 10);

*sym ='\0';

}

// проверка является ли символ знаком арифметического действия

bool isSign(char ch)

{

char sings[] = {'+', '-', '*'};

for (int i = 0; i < 3; i++)

{

if (sings[i] == ch) return true;

}

return false;

}

// проверка является ли очередной символ цифрой

bool isDigit(char ch)

{

char digits[] = {'0','1','2','3','4','5','6','7','8','9'};

for (int i = 0; i < 10; i++)

{

if (digits[i] == ch) return true;

}

returnfalse;

}

// функция проверки правильности формулы

bool checkFormula(char* formula)

{

// начальное состояние анализатора

int state = START;

// идем по строке пока не символ с кодом 10 (ENTER)

while(*formula != 10)

{

// получение текущего символа

char ch = *formula;

// если пробел - незначащий символ, пропускаем

if (ch == ' ')

{

formula++;

continue;

}

// если встретилась цифра и текущее состояние начальное или 'знак'

else if (isDigit(ch) && (state == START || state == SIGN))

{

state = DIGIT;

}

// если встретился знак и текущее состоянии 'цифра'

else if (isSign(ch) && state == DIGIT)

{

state = SIGN;

}

// любой другой случай ошибочный

else

{

return false;

}

// смещение указателя по строке на следующий символ

formula++;

}

// если последнее состояние цифра - правильно, если знак - неправильно

return (state == DIGIT) ? true : false;

}

int main(int argc, int *argv[])

{

char* formula = (char*) malloc (L * sizeof(char));

printf("Input formula: ");

// ввод строки

inputstring(formula);

// проверка правильности

if (checkFormula(formula))

{

printf("Formula is valid\n");

}

else

{

printf("Formula is not valid\n");

}

return0;

}

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

Текстовый файл

Цель: закрепление на практике функций работы с текстовыми файлами.

Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа одного разобранного задания и самостоятельной работы.

Обязательное зачетное задание.

Необходимый уровень знаний:

  • работа с функциями;

  • использование функций из библиотеки <string.h>.

Задача

В файле “a.txt” содержится некоторая текстовая информация. Написать три варианта считывания содержимого файла “a.txt” в файл “b.txt”.

Дополнительные условия: использовать различные библиотечные функции.

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

// первый вариант функции копирования (используются функции fputc();fgetc())

void filecopy1(FILE *source, FILE *target)

{

int c;

// считываем файл посимвольно, пока не достигнут конец файла

while ((c = fgetc(source)) != EOF)

{

// пишем в файл считанный символ

fputc(c, target);

}

}

// второй вариант функции копирования (используются функции fputs();fgets())

void filecopy2(FILE *source, FILE *target)

{

char* str = (char*) malloc (255 * sizeof(char));

// считываем строкeдлинной 255 символов из файла

while ((str = fgets(str, 255, source)) != NULL)

{

// и записываем ее в другой файл

fputs(str, target);

}

}

// третий вариант функции копирования (используются функции fscanf(), fprintf())

void filecopy3(FILE *source, FILE *target)

{

char* str = (char*) malloc (255 * sizeof(char));

// форматированное чтение строки из 255 символов из файла

while (fscanf(source, "%s", str) != EOF)

{

// и запись их в другой

fprintf(target, "%s", str);

}

}

void copy(char* fsource, char* ftarget, int type)

{

// описание переменных для файл чтения и файла записи

FILE* source;

if (fopen(fsource, "r"==NULL)

{

printf("Cannot open file\n"); exit(0);

}

FILE* target = fopen(ftarget, "w");

// копирование

switch(type)

{

case 1:

filecopy1(source, target);

break;

case 2:

filecopy2(source, target);

break;

case 3:

filecopy3(source, target);

break;

}

// вывод результата на экран

printf("File '%s' copied to '%s'. %d bytes has been written\n", fsource, ftarget, ftell(source));

// закрытие файлов

if (fclose(source)!=0)

fprintf(stderr," Cannot close file \n");

if (fclose(target)!=0)

fprintf(stderr," Cannot close file \n");

}

int main ()

{

copy("laba91.dsp", "copy1.txt", 1);

copy("laba91.dsw", "copy2.txt", 2);

copy("laba91.plg", "copy3.txt", 3);

return 0;

}

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]