编译原理实验采用C 模式编程程序清单及运行结果.docx
《编译原理实验采用C 模式编程程序清单及运行结果.docx》由会员分享,可在线阅读,更多相关《编译原理实验采用C 模式编程程序清单及运行结果.docx(53页珍藏版)》请在冰豆网上搜索。
编译原理实验采用C模式编程程序清单及运行结果
#include
#include
#include
#include
usingnamespacestd;
#defineMaxlength20
#defineFILE_NAME_MAX50
#defineNUM2//二进制转换
#defineLT30//'<'
#defineLE31//'<='
#defineNE32//'<>!
='
#defineGT33//'>'
#defineGE34//'>='
#defineEQ35//'='
#defineLB36//'('
#defineRB37//')'
#defineDMU38//'**'
#defineAS40//:
=
#definePS41//+
#defineMI42//-
#defineWH43//'?
'
#defineMU39//'*'
#defineDI46///
#defineCA44//','
#defineBH45//';'
#defineCO47//':
'
#defineDPS48//++
structkeyword{//符号表
char*word;
intvalue;
}keytab[]={
"break",1,
"char",2,
"continue",3,
"do",4,
"double",5,
"else",6,
"extern",7,
"float",8,
"for",9,
"int",10,
"if",11,
"long",12,
"short",13,
"static",14,
"switch",15,
"void",16,
"while",17,
"bool",18,
"false",19,
"true",20,
"sizeof",21,
"FILE",22,
"case",23,
"default",24,
"return",25
};
FILE*fp=NULL,*fpp;
charstr_char[Maxlength];//字符数组str_char,用来依次存放一个单词词文中的各个字符
char*err="该字符未定义!
!
!
\n";
intstrlength=sizeofkeytab/sizeofkeytab[0];//计算keytable数组中的元素数量
intcomp(constvoid*a,constvoid*b);//qsort排序
intcompare_b(constvoid*a,constvoid*b);//besearch查找关键字表
voidinteger(intn);
voiddecimal(doublem);
voidmain(){
intch;
inti;//str_char[i]:
max(i)=Maxlength
doublef;
longn;
keyword*flag;//判断搜索函数是否成功返回
intcountid=70;//关键字的类别码已给出,而标识符类别码统一一码
intcountnum=80;//整型数类别码统一一码
char*filename;
fpp=fopen("schu.txt","w");
filename=(char*)malloc(FILE_NAME_MAX);
printf("请输入文件的名字:
");
while
(1){
scanf("%s",filename);
if(fopen(filename,"r")!
=NULL)
break;
printf("源文件打开失败,请再试一次!
!
!
\n\n请输入文件的名字:
");
}
fprintf(fpp,"<\t\t30\n<=\t\t31\n<>!
=\t\t32\n>\t\t33\n>=\t\t34\n=\t\t35\n(\t\t36\n");
fprintf(fpp,")\t\t37\n**\t\t38\n:
=\t\t40\n+\t\t41\n-\t\t42\n?
\t\t43\n*\t\t39\n/\t\t46\n,\t\t44\n");
fprintf(fpp,";\t\t45\n:
\t\t47\n\n");
for(i=0;iif(keytab[i].value==3)
fprintf(fpp,"%s\t%d\n",keytab[i].word,keytab[i].value);
else
fprintf(fpp,"%s\t\t%d\n",keytab[i].word,keytab[i].value);
}
fprintf(fpp,"\n\n");
while((ch=fgetc(fp))!
=EOF){
fputc(ch,fpp);
}
fp=fopen(filename,"r");
fprintf(fpp,"\n\n");
qsort(keytab+1,strlength,sizeof(keyword),comp);
while((ch=fgetc(fp))!
=EOF){
if(isspace(ch))//如果是一个空白字符
continue;
elseif(isalpha(ch)){//它必须是一个标识符
str_char[0]=ch;
ch=fgetc(fp);
i=1;
while(isalnum(ch)){//一个字母数字字符
str_char[i]=ch;
i++;
ch=fgetc(fp);
}
if(istr_char[i]='\0';
fseek(fp,-1,SEEK_CUR);//撤回
flag=(keyword*)bsearch(str_char,keytab+1,strlength,sizeof(keyword),compare_b);
if(flag)//参考关键字
fprintf(fpp,"%s\t(%d,%s)\n",str_char,flag->value,str_char);
else//是一个标识符
fprintf(fpp,"%s\t(%d,%s)\n",str_char,countid,str_char);
}
else
fprintf(fpp,"%s",err);
}
elseif(isdigit(ch)){
str_char[0]=ch;
ch=fgetc(fp);
i=1;
while(isdigit(ch)||ch=='.'){
str_char[i]=ch;
i++;
ch=fgetc(fp);
}
if(i{
str_char[i]='\0';
fseek(fp,-1,SEEK_CUR);//撤回
if('0'==str_char[0]&&str_char[1]!
='.'&&str_char[1]!
='\0')
fprintf(fpp,"%s\t(%s)\n","Invalidnum",str_char);//0是第一个数字
else
{
fprintf(fpp,"%s\t(%d,",str_char,countnum);
f=(double)atof(str_char);
if(f<0){
fprintf(fpp,"-");
f=-f;
}
n=(long)f;
if(n==0)fprintf(fpp,"0");
integer(n);
if(f-int(f)>1e-9)fprintf(fpp,".");
decimal(f-n);fprintf(fpp,")\n");
}
}
else
fprintf(fpp,"%s",err);
}
else
switch(ch){
case'<':
{
ch=fgetc(fp);
if(ch=='=')
fprintf(fpp,"%s\t(%d,%s)\n","<=",LE,"<=");
elseif(ch=='>')
fprintf(fpp,"%s\t(%d,%s)\n","<>",NE,"<>");
else{
fseek(fp,-1,SEEK_CUR);//撤回
fprintf(fpp,"%c\t(%d,%c)\n",'<',LT,'<');
}
break;
}
case':
':
{
ch=fgetc(fp);
if(ch=='=')fprintf(fpp,"%s\t(%d,%s)\n",":
=",AS,":
=");
else{
fseek(fp,-1,SEEK_CUR);
fprintf(fpp,"%c\t(%d,%c)\n",':
',CO,':
');
}
break;
}
case'>':
{
ch=fgetc(fp);
if(ch=='=')fprintf(fpp,"%s\t(%d,%s)\n",">=",GE,">=");
else{
fseek(fp,-1,SEEK_CUR);
fprintf(fpp,"%c\t(%d,%c)\n",'>',GT,'>');
}
break;
}
case'=':
fprintf(fpp,"%c\t(%d,%c)\n",'=',EQ,'=');break;
case';':
fprintf(fpp,"%c\t(%d,%c)\n",';',BH,';');break;
case',':
fprintf(fpp,"%c\t(%d,%c)\n",',',CA,',');break;
case'(':
fprintf(fpp,"%c\t(%d,%c)\n",'(',LB,'(');break;
case')':
fprintf(fpp,"%c\t(%d,%c)\n",')',RB,')');break;
case'-':
fprintf(fpp,"%c\t(%d,%c)\n",'-',MI,'-');break;
case'+':
{
ch=fgetc(fp);
if(ch=='+')fprintf(fpp,"%s\t(%d,%s)\n","++",DPS,"++");
else{
fseek(fp,-1,SEEK_CUR);
fprintf(fpp,"%c\t(%d,%c)\n",'+',PS,'+');
}
break;
}
case'*':
{
ch=fgetc(fp);
if(ch=='*')fprintf(fpp,"%s\t(%d,%s)\n","**",DMU,"**");
else{
fseek(fp,-1,SEEK_CUR);
fprintf(fpp,"%c\t(%d,%c)\n",'*',MU,'*');
}
break;
}
case'/':
fprintf(fpp,"%c\t(%d,%c)\n",'/',DI,'/');break;
case'?
':
fprintf(fpp,"%c\t(%d,%c)\n",'?
',PS,'?
');break;
default:
fprintf(fpp,"(%c)还未定义!
!
!
\n",ch);break;
}
}
fclose(fp);
fclose(fpp);
printf("\t\t程序结果以输出到源程序所在位置,输出文件名:
schu.txt!
!
!
\n");
}
intcomp(constvoid*a,constvoid*b){returnstrcmp(((keyword*)a)->word,((keyword*)b)->word);}
intcompare_b(constvoid*a,constvoid*b){returnstrcmp((char*)a,((keyword*)b)->word);}
voidinteger(intn){
if(n>0){
integer(n/NUM);
fprintf(fpp,"%d",n%NUM);
}
}
voiddecimal(doublem){
staticintt=0;
if(m>0&&t<=16){
m*=NUM;
t++;
fprintf(fpp,"%d",(long)m);
decimal(m-(long)m);
}
实验结果:
<30
<=31
<>!
=32
>33
>=34
=35
(36
)37
**38
:
=40
+41
-42
?
43
*39
/46
44
;45
:
47
break1
char2
continue3
do4
double5
else6
extern7
float8
for9
int10
if11
long12
short13
static14
switch15
void16
while17
bool18
false19
true20
sizeof21
FILE22
case23
default24
return25
inti,j,n;
doublesum;
n=10.5,mn=20,mm=0123;
sum=0.5;
for(i=0;i<=n;i+=1)
{
if(sum<0.2)
j++;
}
int(10,int)
i(70,i)
(44,,)
j(70,j)
(44,,)
n(70,n)
;(45,;)
double(5,double)
sum(70,sum)
;(45,;)
n(70,n)
=(35,=)
10.5(80,1010.1)
(44,,)
mn(70,mn)
=(35,=)
20(80,10100)
(44,,)
mm(70,mm)
=(35,=)
Invalidnum(0123)
;(45,;)
sum(70,sum)
=(35,=)
0.5(80,0.1)
;(45,;)
for(9,for)
((36,()
i(70,i)
=(35,=)
0(80,0)
;(45,;)
i(70,i)
<=(31,<=)
n(70,n)
;(45,;)
i(70,i)
+(41,+)
=(35,=)
1(80,1)
)(37,))
({)还未定义!
!
!
if(11,if)
((36,()
sum(70,sum)
<(30,<)
0.2(80,0.001100110011001)
)(37,))
j(70,j)
++(48,++)
;(45,;)
(})还未定义!
!
!
#include
#include
#include
#definemax50
#defineFILE_NAME_MAX50
intcount=0,L_End=0,flag=1,ll=1,M[max][max];
charStart,End[max],N_End[max],All[max],left[max],right[max][max];
charfirst[max][max],follow[max][max],first_s[max][max],select[max][max];
intflag_first[max],flag_follow[max];
charEmpty[max],p_ded[max],TEMP[max],Follow_tool[max],choose;
FILE*fpp;
intSearch(charc,char*p);
charGetEnd();
voidRecur(char*point);
voidN_recur(char*point);
charGet_grammer(char*t,char*n);
voidMerge(char*d,char*s,inttype);
voidZhjtchu_k(charc);
intQ_Zhjtchu_k(charc);
intJudge_grammer();
voidFIRST_S(inti);
voidFIRST(inti,char*p);
voidFOLLOW(inti);
intJudge_LL();
voidGzao_tab();
voidsyntax();
boolIsN_End(chara);
boolJudge(chara,char*str);
voidMakeN_Endtab(chartemp[][max],intnumber);
voidMakeEndtab(chartemp[][max],intnumber);
voidmenu();
voidmain(){
inti,j;
char*filename;
fpp=fopen("schu.txt","w");
filename=(char*)malloc(FILE_NAME_MAX);
printf("请输入文件的名字:
");
while
(1){
scanf("%s",filename);
if(fopen(filename,"r")!
=NULL)break;
printf("源文件打开失败,请再试一次!
!
!
\n\n请输入文件的名字:
");
}
freopen(filename,"r",stdin);
Start=Get_grammer(End,N_End);
printf("\n\n@:
表示为ε");
printf("\n\n无左递归和回溯的文法数目:
%d,分别是:
",count);
for(i=0;i\t%c→%s",i+1,left[i],right[i]);
printf("\n开始字符:
%c",Start);
strcpy(All,N_End);
strcat(All,End);
printf("\n\n该文法中所有字符:
%s",All);
printf("\n非终结字符:
%s",N_End);
printf("\n终结字符:
%s\n",End);
printf("\nright:
");
for(i=0;iprintf("\nleft:
");
for(i=0;iif(flag==1)flag=Judge_grammer();
printf("\nflag=%d",flag);
if(flag==1){
printf(",文法有效!
!
!
\n");
ll=Judge_LL();
if(ll==1)printf("\nLL=%d,该文法是一个LL1文法!
!
!
\n\n\t预测分析表为:
\n",ll);
if(ll==0)printf("\nLL=%d,该文法不是一个LL1文法!
!
!
\n",ll);
else{
Gzao_tab();
printf("\n\t|");
for(i=0;i<=strlen(End);i++)printf("%c\t",End[i]);
printf("\n________|");
for(i=0;iprintf("\n");
for(i=0;iprintf("%c\t|",N_End[i]);
for(j=0;jif(M[i][j]>=0)
printf("%c→%s\t",N_End[i],right[M[i][j]]);
else
printf("error\t");
printf("\n");
}
menu();
}
}
fclose(fpp);
}
charGet_grammer(char*E_str,char*N_str){//读入一个文法
chars,p[max][max];
inti,j,k;
printf("请输入文法产生式的条数:
");
scanf("%d",&i);
printf("%d\n",i);
getchar();
printf("请输入文法的开始符号:
");
scanf("%c",&s);
printf("%c\n",s);
for(j=1;j<=i;j++){
printf("请输入文法的第%d条(共%d条)产生式:
",j,i);
scanf("%s",p[j-1]);
printf("%s\n",p[j-1]);
}
for(j=0;j
if(p[j][1]!
='-'||p[j][2]!
='>'){
printf("\n输入错误!
!
!
");
flag=0;
return'\0';
}//检测输入错误
MakeN_Endtab(p,i);//存储非终结字符
MakeEndtab(p,i);//存储终结字符