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

curpos=ftell(in);

i++;

}

lex[i]='\0';

fseek(in,curpos,0);

i=find_keyword(lex);//ищем ключ слово, если нашли - возвращаем его положение в массиве

if(i>0)

{

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

}

//не нашли ключ слово - проверяем на имя функции:

else

{

curpos=ftell(in);

//sym[n]=fgetc(in);

while(sym[n]=='\n'||sym[n]=='\t'||sym[n]=='\0'||sym[n]==' ')

{

sym[n]=fgetc(in);

}

if(sym[n]=='(')

{

fseek(in,curpos,0);

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

{   

if ( strcmp(ident[k],lex) == 0)

{

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

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

}

}

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

if(i!=555)

{

strcpy(ident[c_id],lex);

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

c_id++;

}

}

else {fseek(in,curpos,0);

}

}

}

switch(sym[n])//проверяем символ

{

//проверка на числа:

case '-':

curpos=ftell(in);

tmp=fgetc(in);

if(!isdigit(tmp)&&tmp!='.'){fseek(in,curpos,0);goto def;}

else fseek(in,curpos,0);

case '.':

case '0': case '1': case '2': case '3':

case '4': case '5': case '6':

case '7': case '8': case '9':

KA_number();

break;

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

//проверка на разделители:

def:

default:int curpos1;

curpos=ftell(in);//сохранение позиции в файле (тобы вернуться,если прочит след символ-не опер)

for(i=0;i<27;i++)//ищем опер в массиве операторов (сначала поиск только по унарным)

{

if(Operators[i][0]==sym[n]) //если нашли унарный опер

{    

temp[0]=Operators[i][0];//то сохран его

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

temp[1]=sym[n];temp[2]='\0';

y=false;j=i;

for(i=27;i<47;i++)//"===", "!==", ">>=", "<<=" не проверяем

if(strcmp(Operators[i],temp)==0) //если нашли бинарн опер

{

y=true;//есть бин опер

if(i>=29&&i<=32) //если есть "==", "!=", "<<", ">>", то чит еще символ

//для проверки на "===", "!==", ">>=", "<<="

{

curpos=ftell(in);

sym[n] = fgetc(in);

if(sym[n]=='=')

{

temp[2]='=';

temp[3]='\0';

//есть 3-й оператор

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

}

else {fseek(in,curpos,0);

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

}//нет 3-го оператора

}

else 

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

}

}

if(y==false)

{

y=false;

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

fseek(in,curpos,0);

}//нет опер из 2 или 3 симв, значит это унарн опер

}

}

break;

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

case '\n':

case '\t':

case '\0':

case ' ':

break;

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

//обработка строк:

case '\"':i=0;j=0;

strcpy(out_mas[c],"( ,10)\0");out_mas[c][1]=char(50); c++;

sym[n]=fgetc(in);

while (sym[n]!='\"')

{tmp=sym[n];

Strings[str_num][i]=sym[n];

if(sym[n]=='$')

{

sym[n]=fgetc(in);i++;

curpos=ftell(in);

if (isdigit(sym[n])) break;//c цифры наинаться не может

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

{

lex[j]=sym[n];//записываем  идентификатор в строку

Strings[str_num][i]=sym[n];i++;

n++;

sym[n]=fgetc(in);

j++;

curpos=ftell(in);

}

fseek(in,curpos-1,0);i-=1;

lex[j]='\0';

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

{   

if ( strcmp(ident[k],lex) == 0)

{

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