语法分析实验报告文档格式.docx
《语法分析实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《语法分析实验报告文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
a=1;
b=2;
c=a+b;
c=2*(a+b);
printf("
c=%d\n"
c);
}
语法分析程序为:
#include<
stdlib.h>
string.h>
////////////////////////////存放归约步骤的一个整形数组///////////////////////////////
intstep_result[1000];
//存放归约步骤的一个全局数组
intstep_result_len=0;
//统计全局数组的长度每次清零应该
////////////////////////////////定义文法符号优先表用int型矩阵表示///////////////////
intMatux[8][8]={{1,1,-1,-1,-1,1,-1,1},{1,1,-1,-1,-1,1,-1,1},{1,1,1,1,-1,1,-1,1},{1,1,1,1,-1,1,-1,1},
{-1,-1,-1,-1,-1,0,-1,-3},{1,1,1,1,-2,1,-2,1},{1,1,1,1,-2,1,-2,1},{-1,-1,-1,-1,-1,-4,-1,0}};
char*STR[6]={"
N+N"
"
N-N"
N*N"
N/N"
(N)"
i"
};
//定义文法可规约可归约字符串
charstack[100];
//定义符号栈
intstack_len=0;
//定义初始化符号栈的长度为0
intGetchar_len=0;
//定义取得字符的全局在窜中的变量
////////////////////////////////////////////////////////////////////////////////////////
boolIsLetter(charch)//判断当前ch是否为字符///////////////////////////////////////////
if((ch>
='
a'
&
ch<
z'
)||(ch>
A'
Z'
))
{
return1;
//如果ch是字母则返回1
}
else
return0;
//如果不是字母则返回0
boolIsDigit(charch)//判断当前ch是否为数字/////////////////////////////////////////////
if(ch>
0'
9'
)
//如果ch是数字则返回1
//如果不是数字则返回0
/////////////////////求出终结符对应的优先表矩阵中的行列位置的函数//////////////////////
intFind_two_table(charch)//求出对应的优先表的行数和列数的一个函数
switch(ch)
case'
+'
:
return0;
-'
return1;
*'
return2;
/'
return3;
('
return4;
)'
return5;
i'
return6;
#'
return7;
default:
return-1;
////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////根据预处理求出算数分析的表达式存放在一个二维数组里面的一个函数///////////////
intFind_num_string(charnum_string[100][100])
{
inti,j,flag;
charch,old_ch='
'
string[20];
FILE*fp;
您好!
请您输入预处理程序的文件名称:
"
);
gets(string);
if((fp=fopen(string,"
r"
))==NULL)//打开文件,如果打开失败则提示
printf("
您打开的文件不存在,请您重新打开文件\n"
//文件打开失败提示打开的文件不存在
i=0;
while(!
feof(fp))
j=0;
ch=fgetc(fp);
while(ch!
!
{
old_ch=ch;
ch=fgetc(fp);
}
if(old_ch!
>
'
old_ch!
<
if(ch!
{
while(ch!
;
{
num_string[i][j]=ch;
ch=fgetc(fp);
j++;
}
i++;
num_string[i][j]='
\0'
}
flag=i-1;
fclose(fp);
returnflag;
/////////////////////////将求出的算术表达式转化成可输入串的函数/////////////////////////
voidConvert_input_string(charnum_string[100],charinput_string[100])
inti=0,i_input_str=0;
charch,flag_ch;
/////////////////////begin////////////////////////////////
ch=num_string[i];
while(ch!
if(IsDigit(ch))
flag_ch='
else
if(IsLetter(ch))
flag_ch='
flag_ch=ch;
switch(flag_ch)
case'
{
while((IsLetter(ch)||IsDigit(ch)||ch=='
_'
)&
ch!
i++;
ch=num_string[i];
input_string[i_input_str]='
i--;
break;
while((IsDigit(ch)||ch=='
.'
input_string[i_input_str]='
default:
input_string[i_input_str]=ch;
i++;
ch=num_string[i];
if(ch!
i_input_str++;
input_string[i_input_str]='
//////////////////////end///////////////////////
return;
////////////////////自动取得是规约串中字符的一个函数///////////////////
charGetchar(charinput_string[100])
charch;
inti,len;
charinput_string_temp[100]={'
len=strlen(input_string);
ch=input_string[0];
for(i=1;
i<
len;
i++)
input_string_temp[i-1]=input_string[i];
if(input_string[i-1]=='
break;
strcpy(input_string,input_string_temp);
returnch;
//////////////////////判断是否是终结符///////////////////////////////
boolChar_IsVt(charch)
if(Find_two_table(ch)>
=0&
Find_two_table(ch)<
=9)
///////////////////////判断终结符之间的优先关系的一个函数////////////////
intFind_relaion(charstack_ch,charch)//找出终结符之间的优先关系的一个函数
introw,lie,result;
row=Find_two_table(stack_ch);
lie=Find_two_table(ch);
if((lie<
0||lie>
7)&
N'
//printf("
非法标识符%c"
ch);
return-10;
result=Matux[row][lie];
returnresult;
//返回终结符对应的行数或者是列数
////////////////////////////出错处理子程序///////////////////////////////
voidProcess_Error(intreturn_num)
if(return_num==-2)//出错处理函数,一共有三种错误情况
Error!
算术表达式缺少运算符,请查看更改!
\n"
if(return_num==-3)
printf("
算术表达式缺少右括号,请查看更改!
if(return_num==-4)
printf("
算术表达式缺少左括号,请查看更改!
//函数结束
////////////////////处理一个算术表达式的规约过程的函数///////////////////
voidmain_analyous(charinput_string[100])
intk,step=1,i,j,flag=0,p;
intflag_temp=0,input_string_len;
charch,q_ch;
charstack[100]={'
},temp_str[20]={'
k=1;
stack[k]='
步骤号动作优先关系当前分析符符号栈剩余输入串\n"
1预备<
#%s\n"
input_string);
ch=Getchar(input_string);
charstack_pop='
while(stack_pop!
if(Char_IsVt(ch))
j=k;
j=k-1;
interror;
//////////////////判断输入串中是不是存在非法符号的存在则返回-10/////////////
error=Find_relaion(stack[j],ch);
if(error==(-10))
输入串中存在非法符号%c,输入串分析结束!
return;
///////////////////////////////////////////////////////////////////////////
while(Find_relaion(stack[j],ch)==1)
for(inth=0;
h<
20;
h++)//每次规约过程中存放可归约变量清零
temp_str[h]='
flag=0;
//////////////////每次规约flag清零//////////////////
do
q_ch=stack[j];
if(Char_IsVt(stack[j-1]))
j=j-1;
else
j=j-2;
}while((Find_relaion(stack[j],q_ch)==1)||(Find_relaion(stack[j],q_ch)==0));
/////////////////////////////////////////////////////////////////////////
p=j+1;
temp_str[flag]=stack[p];
//将stack[j+1]的字符给临时数组temp+str中进行和产生式右部进行比较
while(p<
k)//循环一直到stack[j+1]==stack[k]结束
p=p+1;
flag++;
temp_str[flag]=stack[p];
for(i=0;
6;
if(strcmp(temp_str,STR[i])==0)
while(p<
k)//循环一直到stack[j+1]==stack[k]结束每次规约的时候同时讲规约部分的栈清空
{
p=p+1;
stack[p]='
}
k=j+1;
stack[k]='
/////////////////////////////输出归约过程的一行的代码/////////////////////////////////////////////////////
step++;
step_result[step_result_len]=step;
step_result_len++;
printf("
%4d"
step);
归约"
>
"
%7c"
for(intr=1;
r<
=k;
r++)
%c"
stack[r]);
for(r=0;
12-k;
}
input_string_len=strlen(input_string);
for(r=0;
=input_string_len;
input_string[r]);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
flag_temp=1;
break;
if(flag_temp==0)
没有这样的产生式!
///////////////////stack[j+1]到stack[k]规约过程结束//////////////////
if((Find_relaion(stack[j],ch)==-1)||(Find_relaion(stack[j],ch)==0))
k=k+1;
stack[k]=ch;
interror;
error=Find_relaion(stack[j],ch);
Process_Error(error);
//////////////////////////输出归约过程的一行的代码////////////////////////////////
step++;
移进"
if(Find_relaion(stack[j],ch)==-1)
<
if(Find_relaion(stack[j],ch)==0)
="
for(r=0;
input_string_len=strlen(input_string);
/////////////////////////////////////////////////////////////////////////////////////////
ch=Getchar(input_string);
stack_pop=stack[k];
////////////////////判断最终规约后的符号栈中是否是#N#形式,如果是那么久分析正确////
if((stack[1]=='
(stack[2]=='
(stack[3]=='
输入的算术表达式正确!
您输入的算术表达式有错误,请检查!
/////////////////////////打印每个算术表达式求解的归约过程的一个函数/////////////////////
voidPrint_step()
inti;
for(i=0;
step_result_len;
%d"
step_result[i]);
step_result_len=0;
////////////////////main()/////////////////////////////
intmain()
inti,j,len,result;
charnum_string[100][100]={'
charresult_string[100];
******************************算符优先语法分析程序***************************\n"
*E->
E+T|E-T|T分析的是四则混合运算的文法*\n"
*T->
T*F|T/F|F其中:
E表示算术表达式;
T表示项;
*\n"
*F->
(E)|ii表示变量或常数;
*****************************************************************************\n"
*终结符优先表*\n"
*+-*/(