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 – некоторый терминал.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.