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

上传人:b****4 文档编号:17306495 上传时间: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

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"

)\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"

\t\t45\n:

\t\t47\n\n"

for(i=0;

i<

strlength;

i++){

if(keytab[i].value==3)

fprintf(fpp,"

%s\t%d\n"

keytab[i].word,keytab[i].value);

else

%s\t\t%d\n"

\n\n"

while((ch=fgetc(fp))!

=EOF){

fputc(ch,fpp);

fp=fopen(filename,"

qsort(keytab+1,strlength,sizeof(keyword),comp);

=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<

Maxlength){

str_char[i]='

\0'

fseek(fp,-1,SEEK_CUR);

//撤回

flag=(keyword*)bsearch(str_char,keytab+1,strlength,sizeof(keyword),compare_b);

if(flag)//参考关键字

%s\t(%d,%s)\n"

str_char,flag->

value,str_char);

else//是一个标识符

str_char,countid,str_char);

else

fprintf(fpp,"

err);

elseif(isdigit(ch)){

str_char[0]=ch;

ch=fgetc(fp);

i=1;

while(isdigit(ch)||ch=='

.'

){

str_char[i]=ch;

i++;

if(i<

Maxlength)

{

if('

0'

==str_char[0]&

&

str_char[1]!

%s\t(%s)\n"

Invalidnum"

str_char);

//0是第一个数字

{

%s\t(%d,"

str_char,countnum);

f=(double)atof(str_char);

if(f<

0){

-"

f=-f;

n=(long)f;

if(n==0)fprintf(fpp,"

0"

integer(n);

if(f-int(f)>

1e-9)fprintf(fpp,"

."

decimal(f-n);

)\n"

else

fprintf(fpp,"

switch(ch){

case'

{

ch=fgetc(fp);

if(ch=='

="

LE,"

elseif(ch=='

NE,"

else{

fseek(fp,-1,SEEK_CUR);

%c\t(%d,%c)\n"

LT,'

}

break;

}

case'

)fprintf(fpp,"

AS,"

CO,'

{

GE,"

GT,'

case'

EQ,'

break;

BH,'

CA,'

LB,'

RB,'

-'

MI,'

+'

)fprintf(fpp,"

++"

DPS,"

PS,'

{

**"

DMU,"

MU,'

/'

DI,'

default:

(%c)还未定义!

ch);

break;

fclose(fp);

fclose(fpp);

\t\t程序结果以输出到源程序所在位置,输出文件名:

schu.txt!

}

intcomp(constvoid*a,constvoid*b){returnstrcmp(((keyword*)a)->

word,((keyword*)b)->

word);

intcompare_b(constvoid*a,constvoid*b){returnstrcmp((char*)a,((keyword*)b)->

voidinteger(intn){

if(n>

integer(n/NUM);

%d"

n%NUM);

voiddecimal(doublem){

staticintt=0;

if(m>

0&

t<

=16){

m*=NUM;

t++;

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

=n;

i+=1)

if(sum<

0.2)

j++;

int(10,int)

i(70,i)

(44,,)

j(70,j)

n(70,n)

(45,;

double(5,double)

sum(70,sum)

=(35,=)

10.5(80,1010.1)

mn(70,mn)

20(80,10100)

mm(70,mm)

Invalidnum(0123)

0.5(80,0.1)

for(9,for)

((36,()

0(80,0)

=(31,<

=)

+(41,+)

1(80,1)

)(37,))

({)还未定义!

if(11,if)

(30,<

0.2(80,0.001100110011001)

++(48,++)

(})还未定义!

 

#include<

#definemax50

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();

inti,j;

=NULL)break;

freopen(filename,"

stdin);

Start=Get_grammer(End,N_End);

\n\n@:

表示为ε"

\n\n无左递归和回溯的文法数目:

%d,分别是:

count);

count;

i++)printf("

\n%d:

\t%c→%s"

i+1,left[i],right[i]);

\n开始字符:

%c"

Start);

strcpy(All,N_End);

strcat(All,End);

\n\n该文法中所有字符:

All);

\n非终结字符:

N_End);

\n终结字符:

%s\n"

End);

\nright:

%s"

right[i]);

\nleft:

%c"

left[i]);

if(flag==1)flag=Judge_grammer();

\nflag=%d"

flag);

if(flag==1){

文法有效!

ll=Judge_LL();

if(ll==1)printf("

\nLL=%d,该文法是一个LL1文法!

\n\n\t预测分析表为:

ll);

if(ll==0)printf("

\nLL=%d,该文法不是一个LL1文法!

else{

Gzao_tab();

printf("

\n\t|"

for(i=0;

=strlen(End);

%c\t"

End[i]);

\n________|"

strlen(End);

________"

strlen(N_End);

printf("

%c\t|"

N_End[i]);

for(j=0;

j<

j++)

if(M[i][j]>

=0)

printf("

%c→%s\t"

N_End[i],right[M[i][j]]);

else

error\t"

printf("

menu();

charGet_grammer(char*E_str,char*N_str){//读入一个文法

chars,p[max][max];

inti,j,k;

请输入文法产生式的条数:

&

i);

%d\n"

i);

getchar();

请输入文法的开始符号:

scanf("

s);

%c\n"

s);

for(j=1;

=i;

j++){

请输入文法的第%d条(共%d条)产生式:

j,i);

p[j-1]);

for(j=0;

i;

if(p[j][1]!

||p[j][2]!

\n输入错误!

flag=0;

return'

}//检测输入错误

MakeN_Endtab(p,i);

//存储非终结字符

MakeEndtab(p,i);

//存储终结字符

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

当前位置:首页 > 教学研究 > 教学反思汇报

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

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