Задание:
1. Реализовать при помощи рекурсивного спуска нахождение:
o имен переменных
o целых чисел
o операций '+', '-', '*', '/'
o скобок
2. Обработку комментариев (тип комментария Pascal комментарий (* ... *) с поддержкой многострочности.)
3. Всё прочее должно вызывать ошибку разбора строки (строка это весь входной файл)
4. После разбора каждой строки выдавать надпись 'OK' или 'FAILED' в зависимости от результата разбора
Где освобождается память под mainstring?
Код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
extern int add (void);
extern int mult (void);
extern int prim (void);
extern int number(double *a);
extern int match(char *S);
char* mainstring;
char* temp;
char* current;
FILE * _file;
char * _fileName;
int error = 0;
//функция var которая нигде не вызвана а может её вообще удалить?
int var (char *S)
{
int i = 0;
while ((((current[i]>='a') && (current[i]<='z')) || ((current[i]>='A') && (current[i]<='Z'))) || (current[i] == '_') || (((current[i] <= '9') && (current[i] >= '0'))))
{
if ((current[i] <= '9') && (current[i] >= '0') && (i == 0))
{
return 0;
}
S[i] = current[i];
i++;
}
if (i==0)
{
return 0;
}
current += i;
return 1;
}
int main(int argc, char **argv)
{
if (argv[1] !=0)
{
_fileName = malloc(strlen(argv[1])*sizeof(char)); // динамическео выделение памяти под переменную _fileName препод сказал что эта строка не нужна
_fileName = argv[1]; // запись в _fileName значение первого элемента массива аргументов
} else
{
_fileName = malloc(strlen("in.txt")*sizeof(char)); // в случае если argv[1] = 0 дин. выделение памяти другой длины и вот эта
_fileName = "in.txt"; // запись в переменную _fileName значения "in.txt"
}
mainstring = malloc(1000*sizeof(char)); // дин.выделение памяти для переменной mainstring
temp = malloc(1000*sizeof(char)); //дин.выделение памяти для переменной temp
_file = fopen(_fileName, "r"); // _file - указатель на файл _fileName, который открывается для чтения
if(_file == 0) // если файл пуст
{
printf("fail pustoi\%s\"\n",_fileName); //выводим в терминал сообщение "fail pustoi\%s\"\n" + имя файла
return 0;
}
//--udalenie probelov --
int c = getc(_file); //записывает в C символ на который указывает _file
int z = 0; // 0
int i = 0; // 0
int c0 = (int)(' ');
int c2 = getc(_file);
while (c != EOF)
{
if ( (c != (int)(' ')) && (c != (int)('\t'))) // если символ который хранится с С не равен пробелу или табуляции, то выполняется следующий блок
{
z = 0; // 0
temp[i] = c; // в i-й элемент массива temp записываем символ на который указывает c
i++; // инкремент i
if ((c == (int)('+')) || (c == (int)('-')) || (c == (int)('*')) || (c == (int)('/'))) // если с = -, +, * ,/ то
z = 1; // z = 1
}
else if (((c0 >= (int)('0')) && (c0 <= (int)('9'))) || (c0 == (int)(' ')) || (c0 == (int)('\t')) || (c0 == (int)('\n'))) /* в противном случае, если С равно пробелу,
проверяем истинность того. что С>= 0, <=9 или =" " или символу табуляции, или символу перевода каретки.*/
{
if ((c2 >= '0') && (c2 <= '9')) // проверка на то, что c2 >= 0 и с2 <= 9
if (z == 0) // если z = 0 (С не равно - + * / ) то тоесть в массив попадут все символы которые не равны - + * /
{
temp[i] = c; // в массив temp записываем значение С
i++; // инкремент i
error = 1; }
}
c0 = c;
c = c2;
c2 = getc(_file);
}
fclose(_file); // Закрываем файл
i = 0; // Обнуляем i
int j =0; // 0
int flag = 0; // 0
// printf("TEMP:%s\n",temp);
while (temp[i] !=0 ) // проход по символьному массиву
{
if ((temp[i] == '(') && (temp[i + 1] == '*')) // в случае если i-й элемент массива является ( и следующий за ним *
{
i+=2; // увеличить переменную i на 2 (пропустить эти 2 символа)
flag = 1; // установить флаг
while ((!((temp[i] == '*') && (temp[i+1] == ')'))) && (temp[i]!=0)){ // выполнять цикл пока не будет достигнуто сочетание *) и конец символьного массива.
i++;
}
i+=2; //
}
mainstring[j] = temp[i]; // в mainstring[j] записываем значение temp[i] (кроме (**))
j++;
i++;
}
free(temp); тут под temp освобождается память, а под mainstring нет почему?
printf("MAINSTRING:%s\n",mainstring); // вывести в терминал MAINSTRING
current = mainstring;
if (add()) // в случае если add вернёт TRUE переходим к след. условию
{
if (error == 0){ // если флаг ошибок опущен
printf("\nRESULT: OK\n"); // вывести в терминал OK
return 1;
}
else
{
printf("\nRESULT: FAILED\n"); // в противном случае FAILED
return 0;
}
} else {
printf("\nRESULT: FAILED\n"); // если add вернул FALSE вывести в терминал FAILED
return 0;
}
}