编译原理实验采用C 模式编程程序清单及运行结果文档格式.docx
《编译原理实验采用C 模式编程程序清单及运行结果文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验采用C 模式编程程序清单及运行结果文档格式.docx(53页珍藏版)》请在冰豆网上搜索。
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);
//存储终结字符