编译原理实验采用C 模式编程程序清单及运行结果.docx

上传人:b****4 文档编号:4381106 上传时间:2022-12-01 格式:DOCX 页数:53 大小:33.41KB
下载 相关 举报
编译原理实验采用C 模式编程程序清单及运行结果.docx_第1页
第1页 / 共53页
编译原理实验采用C 模式编程程序清单及运行结果.docx_第2页
第2页 / 共53页
编译原理实验采用C 模式编程程序清单及运行结果.docx_第3页
第3页 / 共53页
编译原理实验采用C 模式编程程序清单及运行结果.docx_第4页
第4页 / 共53页
编译原理实验采用C 模式编程程序清单及运行结果.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

编译原理实验采用C 模式编程程序清单及运行结果.docx

《编译原理实验采用C 模式编程程序清单及运行结果.docx》由会员分享,可在线阅读,更多相关《编译原理实验采用C 模式编程程序清单及运行结果.docx(53页珍藏版)》请在冰豆网上搜索。

编译原理实验采用C 模式编程程序清单及运行结果.docx

编译原理实验采用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;i

if(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(i

str_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;i

printf("\nleft:

");

for(i=0;i

if(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;i

printf("\n");

for(i=0;i

printf("%c\t|",N_End[i]);

for(j=0;j

if(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);//存储终结字符

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1