欢迎来到天天文库
浏览记录
ID:52916271
大小:87.50 KB
页数:10页
时间:2020-03-31
《编译原理实验LL1分析法.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理程序设计实验报告——表达式语法分析器的设计实现班级:计算机1306班姓名:王利达学号:20133959实验目标:使用LL(1)分析法构造表达式语法分析器程序,判别算术表达式,给出判别结果。实验内容:一、概要设计1.算术表达式文法:E→T
2、Eω0TT→F
3、Tω1FF→i
4、(E)其中ω0:+-ω1:*/i:数字或常数文法变换:E→TMM→ω0TM
5、εT→F
6、NN→ω1FN
7、εF→i
8、(E)其中ω0:+-ω1:*/i:数字或常数2.LL(1)分析表表1.LL(1)分析表i+-*/()#EMT,pMT,pMMT,nMT,n
9、ε,pε,pTNF,pNF,pNNF,nNF,nε,pε,pFε,n)E,n)ε,n#OK二、数据结构1.输入表达式定义char型数组expstr为存放输入表达式的数组,charexpstr[100];2.分析栈定义一个栈来进行LL(1)分析。栈中有bottom、top、stacksize等元素,用于程序调用栈和对栈操作。typedefstruct//定义语法的栈{SElemType*bottom;//底SElemType*top;//顶intstacksize;}SqStack;(包括:概要设计、数据结构、流程图、关键函
10、数等有选择填写)源程序代码:(加入注释)#include#include#includeusingnamespacestd;#defineSTACKSIZE30//栈大小#defineSTACKINCREMENT10//栈增量#defineOK1#defineError0#defineOVERFLOW-1typedefcharSElemType;typedefintStatus;inti=0;intcount1=0;intcount2=0;//计数终结符的个数char
11、expstr[100];typedefstruct//定义语法的栈{SElemType*bottom;//底SElemType*top;//顶intstacksize;}SqStack;StatusInitStack(SqStack&S)//初始化栈{S.bottom=(SElemType*)malloc(STACKSIZE*sizeof(SElemType));if(!S.bottom)exit(OVERFLOW);S.top=S.bottom;S.stacksize=STACKSIZE;returnOK;}Status
12、PUSH(SqStack&S,SElemTypee){if(S.top-S.bottom>=S.stacksize){S.bottom=(SElemType*)realloc(S.bottom,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S.bottom)exit(OVERFLOW);S.top=S.bottom+S.stacksize;S.stacksize+=STACKINCREMENT;}*(S.top)=e;(S.top)++;returnOK;}Stat
13、usPOP(SqStack&S,SElemType&e){if(S.top==S.bottom)returnError;S.top--;e=*(S.top);returnOK;}voidwrong()//调用此函数,表示出错{cout<<"Wrong!"<14、15、(s[n]==')')16、17、(s[n]>='0'&&s[n]<='9')18、19、(s[n]>='a'&&s[n]<='z')20、21、22、(s[n]=='+')23、24、(s[n]=='-')25、26、(s[n]=='*')27、28、(s[n]=='/')29、30、(s[n]=='#'))return1;elsereturn0;}boolter_judge(charc)//终结符集合与非终结符集合{if((c=='(')31、32、(c==')')33、34、(c>='0'&&c<='9')35、36、(c>='a'&&c<='z')37、38、(c=='+')39、40、(c=='-')41、42、(c=='*')43、44、(c=='/'))return1;//终结符返回1else//if(c=='E'45、46、c=='E1'47、48、c==49、'T'50、51、c=='T1'52、53、c=='F')return0;//非终结符或#,返回0}boolnum_letter(chars[],inti)//判断当前字符是数字还是字母{if((s[i]>='0'&&s[i]<='9')54、55、(s[i]>='a'&&s[i]<='z')){i++;while((s[i]
14、
15、(s[n]==')')
16、
17、(s[n]>='0'&&s[n]<='9')
18、
19、(s[n]>='a'&&s[n]<='z')
20、
21、
22、(s[n]=='+')
23、
24、(s[n]=='-')
25、
26、(s[n]=='*')
27、
28、(s[n]=='/')
29、
30、(s[n]=='#'))return1;elsereturn0;}boolter_judge(charc)//终结符集合与非终结符集合{if((c=='(')
31、
32、(c==')')
33、
34、(c>='0'&&c<='9')
35、
36、(c>='a'&&c<='z')
37、
38、(c=='+')
39、
40、(c=='-')
41、
42、(c=='*')
43、
44、(c=='/'))return1;//终结符返回1else//if(c=='E'
45、
46、c=='E1'
47、
48、c==
49、'T'
50、
51、c=='T1'
52、
53、c=='F')return0;//非终结符或#,返回0}boolnum_letter(chars[],inti)//判断当前字符是数字还是字母{if((s[i]>='0'&&s[i]<='9')
54、
55、(s[i]>='a'&&s[i]<='z')){i++;while((s[i]
此文档下载收益归作者所有