河北工业大学编译原理Word格式.docx
- 文档编号:19494817
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:33
- 大小:208.17KB
河北工业大学编译原理Word格式.docx
《河北工业大学编译原理Word格式.docx》由会员分享,可在线阅读,更多相关《河北工业大学编译原理Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
12
GT
13
GE
:
14
IS
+
15
PL
-
16
MI
*
17
MU
/
18
DI
识别表I所列语言中的部分单词的DFA及相关的语义过程
将表I单词集中的整常数改为无符号常数,无符号常数的单词分类码助记符:
UCON
描述无符号数的正规文法和状态转换图:
无符号数的右线性文法G1[<
无符号数>
]如下:
〈无符号数〉→d〈余留无符号数〉
〈无符号数〉→·
〈小数部分〉
〈无符号数〉→d
〈余留无符号数〉→d〈余留无符号数〉
〈余留无符号数〉→·
〈十进小数〉
〈余留无符号数〉→E〈指数部分〉
〈余留无符号数〉→d
〈十进小数〉→E〈指数部分〉
〈十进小数〉→d〈十进小数〉
〈十进小数〉→d
〈小数部分〉→d〈十进小数〉
〈小数部分〉→d
〈指数部分〉→d〈余留整指数〉
〈指数部分〉→+〈整指数〉
〈指数部分〉→-〈整指数〉
〈指数部分〉→d
〈整指数〉→d〈余留整指数〉
〈整指数〉→d
〈余留整指数〉→d〈余留整指数〉
〈余留整指数〉→d
图所示为上述文法的状态转换图,其中编号0、1、2、…、6分别代表非终结符号<
、<
余留无符号数>
十进小数>
小数部分>
指数部分>
整指数>
及<
余留整指数>
。
文法G1[<
]的状态转换图
包含语义处理过程的识别无符号数的状态矩阵
3、源程序
#include<
stdio.h>
ctype.h>
stdlib.h>
string.h>
math.h>
#defineBEGIN1
#defineEND2
#defineIF3
#defineTHEN4
#defineELSE5
#defineID6
#defineINT7
#defineLT8
#defineLE9
#defineEQ10
#defineNE11
#defineGT12
#defineGE13
#definePL14
#defineMI15
#defineMU16
#defineDI17
#defineIS18
#defineTOKEN_SIZE64
#defineTAB_SIZE5
charTOKEN[TOKEN_SIZE];
externintlookup(char*);
externvoidout(int,char*);
externvoidreport_error();
intGetChar(void);
intEXCUTE(int,int);
intLEX(void);
#defineLETTER0
#defineDIGIT1
#definePOINT2
#defineOTHER3
#definePOWER4
#definePLUS5
#defineMINUS6
#defineClassNo100
#defineClassOther200
#defineEndState-1
intw,n,p,e,d;
intClass;
intICON;
floatFCON;
staticintCurrentState;
charch;
//信息表保存5个关键字
typedefstruct
{
intad;
charid[6];
}info_ele;
info_eleTab[TAB_SIZE]={{1,"
begin"
},{2,"
end"
},{3,"
if"
},{4,"
then"
},{5,"
else"
}};
voidscanner_example(FILE*fp)//扫描器函数
inti,c;
ch=fgetc(fp);
if(isalpha(ch))//是否为字母
{
TOKEN[0]=ch;
i=1;
while(isalnum(ch))//是否为字母或数字
TOKEN[i]=ch;
i++;
}
fseek(fp,-1,1);
TOKEN[i]='
\0'
;
c=lookup(TOKEN);
//调用输出函数out()
if(c==0)
out(ID,TOKEN);
else
out(c,TOKEN);
elseif(isdigit(ch))//判断是否为整数
while(isdigit(ch)||ch=='
.'
||ch=='
e'
-'
)
out(INT,TOKEN);
LEX();
else//判断运算符
if(ch=='
'
\n'
);
//遇见空格、回车继续
switch(ch)
{
case'
='
out(EQ,"
="
break;
case'
'
ch=fgetc(fp);
if(ch=='
out(IS,"
break;
if(ch=='
)out(GE,"
else
{
fseek(fp,-1,1);
out(GT,"
"
case'
)
out(LE,"
elseif(ch=='
out(NE,"
else{
out(LT,"
//case'
out(IS,"
+'
out(PL,"
+"
case'
out(MI,"
-"
*'
out(MU,"
*"
/'
out(DI,"
/"
default:
report_error();
}
intlookup(charp[])//查找是否为关键字
inti=0;
for(i;
i<
TAB_SIZE;
i++)
if(!
strcmp(Tab[i].id,p))
return(Tab[i].ad);
return0;
voidout(inta,char*p)///输出结果
switch(a)
caseBEGIN:
printf("
(BEGIN,%s)\n"
p);
caseEND:
(END,%s)\n"
caseIF:
(IF,%s)\n"
caseTHEN:
(THEN,%s)\n"
caseELSE:
(ELSE,%s)\n"
caseID:
(ID,%s)\n"
caseINT:
printf("
(UCON,%s)\n"
caseLT:
(LT,%s)\n"
caseLE:
(LE,%s)\n"
caseEQ:
(EQ,%s)\n"
caseNE:
(NE,%s)\n"
caseGT:
(GT,%s)\n"
caseGE:
(GE,%s)\n"
casePL:
(PL,%s)\n"
caseMI:
(MI,%s)\n"
caseMU:
(MU,%s)\n"
caseDI:
(DI,%s)\n"
caseIS:
(IS,%s)\n"
voidreport_error()
\n有错误!
\n"
exit(0);
////////////////////////////////////////////////
///识别无符号数////
intHandleOtherWord(void)
returnClassOther;
intHandleError(void)
{printf("
Error!
return0;
intGetChar(inti)
intc;
c=(int)TOKEN[i];
//scanf("
d%"
c);
if(isdigit(c)){d=c-'
0'
returnDIGIT;
if(c=='
)returnPOINT;
||c=='
E'
)returnPOWER;
)returnPLUS;
)returnMINUS;
returnOTHER;
intEXCUTE(intstate,intsymbol)
//floatpow(int,int);
switch(state)
case0:
switch(symbol)
{
caseDIGIT:
n=0;
p=0;
e=1;
w=d;
CurrentState=1;
Class=ClassNo;
casePOINT:
w=0;
CurrentState=3;
default:
HandleOtherWord();
ClassOther;
CurrentState=EndState;
}
break;
case1:
w=w*10+d;
CurrentState=2;
casePOWER:
CurrentState=4;
ICON=w;
CurrentState=EndState;
printf("
%d\n"
ICON);
case2:
n++;
FCON=w*pow(10,e*p-n);
%f\n"
FCON);
case3:
HandleError();
case4:
p=p*10+d;
CurrentState=6;
caseMINUS:
e=-1;
CurrentState=5;
casePLUS:
case5:
case6:
}
returnCurrentState;
intLEX(void)
intch,a=0;
CurrentState=0;
while(CurrentState!
=EndState)
ch=GetChar(a);
EXCUTE(CurrentState,ch);
a++;
returnClass;
voidmain()
externcharch;
FILE*fp;
if((fp=fopen("
data.txt"
"
r"
))==NULL)//打开文件data.txt
\nfileopenerror!
do
scanner_example(fp);
//调用扫描程序
}while(ch!
=EOF);
结果:
实验二语法分析程序实现
通过设计、编制、调试一个典型的语法分析程序(任选有代表性的语法分析方法,如算符优先法、递归下降法、LL
(1)、SLR
(1)、LR
(1)等,作为编制语法分析程序的依据),对扫描器所提供的单词序列进行语法检查和结构分析,实现并进一步掌握常用的语法分析方法。
2、实验设计
文法:
[<
算术表达式>
]
→<
项>
|<
+<
-<
因式>
*<
/<
运算对象>
|(<
若将非终结符号<
和<
分别用E、T、F和i代表,则文法可写成:
E→T|E+T|E-TT→F|T*F|T/FF→i|(E)
设计思路:
用C语言编制算符优先分析法的语法分析程序。
其中使用了分析栈stack,用来在分析过程中存放当前句型的某一前缀,一旦句型的最左素短语在栈顶形成,便立即进行归约。
用两个数组stack[MAXSTACK],a[]实现分析栈和余留符号栈。
然后,构造该文法的算符优先关系矩阵。
在此可以根据算术表达式中各算符的优先级和结合性,直接手工构造算符优先关系表。
算符优先关系表
(
i
#
#defineRIGHT1
#defineERROR0
#defineMAXINPUT300
#defineMAXSTACK100
charstack[MAXSTACK],a[]={'
i'
'
#'
};
/*a[]isinputline余留符号栈*/
intIsHigherThan(int,int);
/*算符优先比较,前者是否高于后者*/
intIsLowerThan(int,int);
/*//算符优先比较,前者是否低于后者*/
intIsEqualTo(int,int);
/*//算符优先比较,前者是否等于后者*/
intReduce(intbegin,intend,intlen);
/*归约函数*/
charvt[3]={'
F'
T'
///*determineifstacksymbolisinVt*/
/////算符优先表///
inttable[8][8]={
{1,1,-1,-1,-1,1,-1,1},
{1,1,1,1,-1,1,-1,1},
{-1,-1,-1,-1,-1,0,-1,'
},
{1,1,1,1,1,1,'
1},
{-1,-1,-1,-1,-1,-1,0,1}
};
intCharToIndex(intch)//算符转换表
intt;
switch(ch)
t=0;
t=1;
t=2;
t=3;
('
t=4;
)'
t=5;
t=6;
t=7;
t=8;
returnt;
intIsVt(intch)//判断是否为终结符
while(ch!
=vt[i])//查看是否为t[]数组中元素
i++;
if(i>
3)
return1;
intIsHigherThan(inti,intj)//算符优先比较,前者是否高于后者
i=CharToIndex(i);
j=CharToIndex(j);
if(i==8||j==8)
elseif(table[i][j]==1)
return1;
elsereturn0;
intIsLowerThan(inti,intj)//算符优先比较,前者是否低于后者
if(i==8||j==8)
elseif(table[i][j]==-1)
intIsEqualTo(inti,intj)//算符优先比较,前者是否等于后者
elseif(table[i][j]==0)
intReduce(intbegin,intend,intlen)//归约函数
inti;
chartemp[50];
charNewVn='
for(i=begin;
=end;
temp[i-begin]=stack[i];
temp[len]='
规约项:
%s\t"
temp);
if(len==3)
switch(temp[1])
NewVn='
default:
elseif(len==1)
switch(temp[0])
-->
%c\n"
NewVn);
returnNewVn;
intmain()
inti,k,r,NewVn;
/*NewVnholdsleftsideofaproduction*/
i=0;
k=0;
/*i,kisindexofa[]andstack[]separately*/
stack[0]='
intj;
r=a[i++];
if(IsVt(stack[k]))j=k;
elsej=k-1;
whil
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北 工业大学 编译 原理
![提示](https://static.bdocx.com/images/bang_tan.gif)