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

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

}

}

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

if(j!=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++;

}

}

sym[n]=fgetc(in);

i++;

}

int k;

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

{   

if ( strcmp(strings[k],Strings[str_num]) == 0)

{

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

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

}

}

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

if(j!=555)

{

strcpy(strings[c_str],Strings[str_num]);

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

c_str++;

}

str_num++;

strcpy(out_mas[c],"( ,10)\0");out_mas[c][1]=char(50); c++; //вывод описателя оператора в файл

break;

case '\'':i=0;

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

sym[n]=fgetc(in);

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

{

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

sym[n]=fgetc(in);

i++;

}

if(find_keyword(Strings[str_num])>0) {str_num--;}

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

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

{   

if ( strcmp(strings[k],Strings[str_num]) == 0)

{

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

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

}

}

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

if(j!=555)

{

strcpy(strings[c_str],Strings[str_num]);

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

c_str++;

}    

str_num++;

break;

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

//убираем комментарии:

case '#':

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

{

sym[n]=fgetc(in);

}

break;

case '/':

curpos=ftell(in);

i=0;n++;

sym[n]=fgetc(in);

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

{n--;

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

{

sym[n]=fgetc(in);

}

break;

}

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

{n--;

sym[n]=fgetc(in);

cycle:                  while (sym[n]!='*')

{

sym[n]=fgetc(in);

}

sym[n]=fgetc(in);

if(sym[n]=='/'){n--;

break;}

else goto cycle;

break;

}

else

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

{

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

}

else

{

fseek(in,curpos,0);

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

}

break;

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

//провера на идентификаторы  

case '$':

i=0;

sym[n]=fgetc(in);

curpos=ftell(in);

if (isdigit(sym[n])) {

break;}//c цифры наинаться не может

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

{

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

n++;

sym[n]=fgetc(in);

i++;

curpos=ftell(in);

}

fseek(in,curpos-1,0);

lex[i]='\0';//стр заканчивается \0

for (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++;

}

break;

}//switch конец

n++;

}

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

//вывод результата:

int k;

for ( k=0;k<c;k++)

{

fprintf( nnn,"%s\t",out_mas[k]);

}

fprintf(nnn,"\n Таблица идентификаторов:\n");

for (  k=0;k<c_id;k++)

{

fprintf( nnn,"%d\t",k);

fprintf( nnn,"%s\n",ident[k]);

}

fprintf(nnn,"\n Таблица операторов:\n");

for (  k=0;k<52;k++)

{

fprintf( nnn,"%d\t",k);