Регулярные языки, конечные автоматы и лексический анализ, страница 2

};

int find_keyword(char mas[]);  //поиск кл слова

int i,j;int c_id=0, c=0,c_con=0,c_str=0;

char out_mas[10000][10];

char temp[4]="   ";

char sym[10000];

char lex[50];

char tmp;

char id[50];

char ident[50][20];

char consts[50][10];

int n=0 ;

FILE *in,*nnn;

//поиск ключевого слова:

int find_keyword(char mas[])

{

for(int j=0;j<91;j++)

{

if (strcmp(mas,KeyWordMass[j])==0) return j;//возвращает позицию в массиве ключ слов

}

return 0;

}

//функция используется для КА определения чисел

int term()

{

char tmp1=sym[n];

curpos=ftell(in);    //

sym[n]=fgetc(in);    //читаем очередной символ

//определяет номер столбца

switch (sym[n]) {

case '0': ; case '1': ; case '2': ;

case '3': ; case '4': ; case '5': ;

case '6': ; case '7': ; case '8': ;

case '9': Num=1; return 0;

case '.': return 1;

case 'e': ;

case 'E': return 2;

case '+':

case '-':

if (tmp1=='e'||tmp1=='E'||Num==0) {return 3;}//минус/плюс числа

else return 4;   // конец числа (минус/плюс - разделитель)

case ',': case ';':case ' ':case '#':case '/':case '=':

case '%': case '<': case '>': case '^':

case '!': case '\n': case '\t': case '\0':

case '*': case ')': case ']':

return 4;    //конец числа

default : return 5;  //неверное число

}

}

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

void KA_number()

{

curpos=ftell(in);

fseek(in,curpos-1,0);

i=0;

//матрица переходов:

int avt[10][6]={1, 3,-1, 2,-1,-1, //0

1, 3, 5,-1,10,-1, //1

1, 3,-1,-1,-1,-1, //2

4,-1,-1,-1,-1,-1, //3

4,-1, 5,-1,10,-1, //4

7,-1,-1, 6,-1,-1, //5

7,-1,-1,-1,-1,-1, //6

8,-1,-1,-1,10,-1, //7

8,-1,-1,-1,10,-1, //8

8,-1,-1,-1,10,-1, //9

};

int top_index=0;

char p[20];

while(top_index!=10)//пока не попали на позицию выхода

{

top_index=avt[top_index][term()];//получаем значение след состояния

if (top_index==-1) {

ShowMessage("Wrong number!!!");return;}//-1 - ошибка

p[i]=sym[n];//сохраняем число

i++;

}

i--;

if(i>0)

{

p[i]='\0';

fseek(in,curpos,0);

}

Num=0;

//сохранение и вывод числа:

for (int k=0;k<50;k++)

{    if ( strcmp(consts[k],p) == 0)

{

i=555;//если есть число в табл, то выводим его положение

strcpy(out_mas[c],"(  ,40)\0");out_mas[c][1]=char(k/10+48);out_mas[c][2]=char(k%10+48);c++;

}

}

//если нет числа в табл, то запоминаем его и выводим его положение

if(i!=555)

{

strcpy(consts[c_con],p);

strcpy(out_mas[c],"(  ,40)\0");out_mas[c][1]=char(c_con/10+48);out_mas[c][2]=char(c_con%10+48);c++;

c_con++;

}

}

//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{}

//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)

{

MyFName ="C:\lab1.txt";

if (OpenDialog1->Execute() )MyFName = (OpenDialog1->FileName);

Form1->Edit1->Text=   MyFName;

Fstr = MyFName.c_str() ;

MyFName_out = MyFName+"_out.txt";

Fstr_out = MyFName_out.c_str() ;

}

//--------------------------------------------------------------------------void __fastcall TForm1::N1Click(TObject *Sender)

{

exit(0);       

}

//--------------------------------------------------------------------------void __fastcall TForm1::N2Click(TObject *Sender)

{

ShowMessage("Лексичекский анализатор языка php\n   Выполнили: \n Клименко В.А\n Зимин А.В.\n группа 4ВС");

}

//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)

{

in=fopen(Fstr,"r");

nnn=fopen(Fstr_out,"w+");

bool y=0;int jj=0;

if (MyFName!="") while(!feof(in))

{

sym[n] = fgetc(in);//читаем символ

/**************************************************************************/

//Проверка на зарез слова:

if(isalpha(sym[n])||sym[n]=='_')

{

i=0;

while (isalpha(sym[n]) || isdigit(sym[n])||sym[n]=='_'  )

{

lex[i]=sym[n];

n++;

sym[n]=fgetc(in);