Языки программирования и трансляторы.Синтаксический анализатор с использованием одного из табличных методов, страница 6

stack[0]=state+1;

}

state=analyze_table[state].jump;

generate_code(out); //сгенерировать код для нового состояния

}

}

else

{

if(analyze_table[state].error)

{

error=1; //произошла ошибка, встретился недопустимый терминал

print_error(out);

}

else

{

state++; //ошибки нет, переходим к следующему состоянию

generate_code(out); //сгенерировать код для нового состояния

}

}

}

}

state=0;

if(!error) generate_code(out);

fclose(in);fclose(out);

}

//--------------------------------------------------------------------------void syntax_analyzer::read_analyze_table(char *filename){

FILE *in;

char str[20],tok[20],*ptr;

int tmp, acc,jmp,st,ret,err;

int i=1,j;

in=fopen(filename,"r");

while(fscanf(in,"%d %s %d %d %d %d %d",&tmp,str,&jmp,&acc,&st,&ret,&err)!=NULL && i<=90)

{

for(j=0;j<TERMINAL_NUM;j++)analyze_table[i].terminals[j][0]='\0'; //обнуляем строки

j=0;

//считываем возможные терминалы, разделенные запятой

sscanf(str,"%[^,]",tok); //считываем терминал, отделенный запятой

strcpy(analyze_table[i].terminals[j],tok);

ptr=strpbrk(str,",\0"); //

if(ptr)ptr++;

while(ptr && sscanf(ptr,"%[^,]",tok)!=NULL)

{

j++;

strcpy(analyze_table[i].terminals[j],tok);

ptr=strpbrk(ptr,",\0");

if(ptr)ptr++;

}

//заполняем остальные поля

analyze_table[i].jump=jmp;

analyze_table[i].accept=acc;

analyze_table[i].stack=st;

analyze_table[i].ret=ret;

analyze_table[i].error=err;

i++;

}

fclose(in);

}

//------------------------end of class--------------------------------------//--------------------------------------------------------------------------void main()

{

syntax_analyzer s;

s.analyze("lexems.txt","out.asm");

}


Тестирование

Исходная программа

Выходнойфайл

1

j=10;

k=1+1;

while(j>3)

while(j)

j=j-k;

k=k+3;

while(k>j)

k=k-1;

.model small

.stack 100h

.code

start:

mov ax,@data

mov ds,ax

mov bx,offset j ;beginning of id=A;

mov ax,10 ;first operand

mov [bx],ax ;write to variable

mov bx,offset k ;beginning of id=A;

mov ax,1 ;first operand

add ax,1 ;add operands

mov [bx],ax ;write to variable

start10:

mov ax,j

cmp ax,3

jna end10

start20:

mov ax,j

test ax,ax

jz end20

;body of the loop

mov bx,offset j ;beginning of id=A;

mov ax,j ;first operand

sub ax,k ;subtract operands

mov [bx],ax ;write to variable

;end of the loop

jmp start20

end20: ;end of while

;end of the loop

jmp start10

end10: ;end of while

mov bx,offset k ;beginning of id=A;

mov ax,k ;first operand

add ax,3 ;add operands

mov [bx],ax ;write to variable

start11:

mov ax,k

cmp ax,j

jna end11

mov bx,offset k ;beginning of id=A;

mov ax,k ;first operand

sub ax,1 ;subtract operands

mov [bx],ax ;write to variable

;end of the loop

jmp start11

end11: ;end of while

.data

j dw ?

k dw ?

end start

2

j=10;

k=1+1;

while(j>3

while(j)

j=j-k;

.model small

.stack 100h

.code

start:

mov ax,@data

mov ds,ax

mov bx,offset j ;beginning of id=A;

mov ax,10 ;first operand

mov [bx],ax ;write to variable

mov bx,offset k ;beginning of id=A;

mov ax,1 ;first operand

add ax,1 ;add operands

mov [bx],ax ;write to variable

start10:

mov ax,j

cmp ax,3

jna end10

Ожидается )!

3

j=10;

k=1+1;

while(j>3)

.model small

.stack 100h

.code

start:

mov ax,@data

mov ds,ax

mov bx,offset j ;beginning of id=A;

mov ax,10 ;first operand

mov [bx],ax ;write to variable

mov bx,offset k ;beginning of id=A;

mov ax,1 ;first operand

add ax,1 ;add operands

mov [bx],ax ;write to variable

start10:

mov ax,j

cmp ax,3

jna end10

Встретили неожидаемый конец программы!

Проведенное тестирование получаемых программ на Ассемблере в отладчике td показало, что они работают верно.

В процессе анализа выявляются ошибки типа: «Ожидается Х!», где X – некоторый терминал.