ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:105.28KB ,
资源ID:21527793      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21527793.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理词法分析器语法分析器实验报告Word格式文档下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理词法分析器语法分析器实验报告Word格式文档下载.docx

1、$LPAR$RPAR-内部字符串标准二进形式对于这个小语言,有几点重要的限制:首先,所有的关键字(如IFWHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的: IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完

2、全没有意义的了)。例如,一个条件语句应写为 IF i0 i= 1;而绝对不要写成 IFi0 i=1;因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。这个小语言的单词符号的状态转换图,如下图:2语法分析器 能识别由加+ 减- 乘* 除/ 乘方 括号()操作数所组成的算术表达式,其文法如下:EE+T|E-T|TTT*F|T/F|FFPF|Pp(E)|i 使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。3中间代码生成器 产生上述算术表达式的中间代码(四元式序列)三、实现过程给出各题目的详细算法描述,数据结构和函数说明,流程图。1、词法分析器的流程图2、语法分析

3、器主程序图3、中间代码生成器流程图:四、源程序词法分析器:#includemalloc.hiostreamusing namespace std;typedef struct table /分析表存储结构 char m100;table;table M100100; /定义分析表typedef struct stacknode /定义栈内元素节点 (带头结点(为空)的) char data; struct stacknode *next;stackk;void initlink(stackk *&s) /初始化新栈 s=(stackk *)malloc(sizeof(stackk); s-ne

4、xt=NULL;void poplink(stackk *&s) /顶元素出栈 stackk *p;char v; if(s-next!=NULL) p=s-next; v=p-data;next=p- free(p);void pushlink(stackk *&s,char x) /新 元 素 入 栈 stackk *p; p=(stackk *)malloc(sizeof(stackk); p-data=x;next=s-next=p;void display(stackk *s) /打印 现实显示 栈内元素 int i=0,j; char st100; while(p!=NULL) s

5、ti+=p- p=p- for(j=i-1;j=0;j-) printf(%c,stj); for(j=0;jnext-int find(char c,char array) /查找函数,int i;int flag=0;for(i=0;i100;i+)if(c=arrayi) flag=1;return flag;int location(char c,char array) /定位函数,指出字符所在位置 return i;void error() /出错函数定义 %15c出错!nvoid analyse(char Vn,char Vt) int i,j,m,p,q,length,t,h;

6、char w,X; char str100;opt0: scanf(%s,str); for(i=0;strlen(str); if(!find(stri,Vt)输入字符串有误!请重新输入! goto opt0; break; stackk *st; initlink(st); pushlink(st,# pushlink(st,Vn0); /#与识别符号入栈 j=0; h=1; w=str0;步骤%-12c分析栈%-24c剩余输入串%-12c所用产生式nopt1:%-16d,h); /显示步骤 h+; display(st); /显示分析栈中内容 X=gettop(st); /上托栈顶符号放

7、入X poplink(st); for(int k=0;k14+j;k+) /打印对齐格式 for(t=j;t%sn,X,str0); /显示对应的产生式 if(strcmp(str0,$)=0) length=strlen(str0); /逆序进栈 for(m=length-1;mm-) pushlink(st,str0m);int main() int i,k,n,r; char Vn100,Vt100,select;*n对任意输入LL(1)文法的分析表,判断验证字符串是否为该文法的句子 n并能给出分析和演示过程。 nopt2:请输入各终结符(#号表示结束 )Vti:,&Vti); if(

8、Vti= r=i;请输入非终结符个数:%dn); getchar(); for (i=0;n;请输入非终结符Vn%d:,i);Vni);请输入此非终结符对应各终结符的产生式右部(null或NULL表示出错;$表示空串): for(k=0;=r;k+),Mik.m);opt3:请输入要分析的字符串,且以#结束: analyse(Vn, Vt);*请选择*n 1: 输入字符串 n 2: 输入新分析表 n 0: 退 出 n*nopt4: cinselect; switch(select) case 1: goto opt3;break;2 goto opt2;0 break; default: pr

9、intf(输入错误!请重新选择: goto opt4;运行结果:语法分析器 源程序:char prog100,token10;char ch;int syn,p,m=0,n,row,sum=0;char *rwtab20=dim,ifdostopend ,andbeginboolcasechar, falseforintnotorsetthentrueuntilwhile;void scaner() for(n=0;nachAZ) m=0; while(ch9 tokenm+=ch; ch=progp+; tokenm+=0 p-; syn=21; for(n=0;20;n+) if(strc

10、mp(token,rwtabn)=0) syn=n+1; break; else if(ch sum=0; while(ch sum=sum*10+ch- ch=progp+; syn=7+15; if(sum32767) syn=-1; else switch(ch) casesyn=8+15;token0=ch;+syn=9+15;* tokenm+=ch; ch=progp+; if(ch= syn=11+15; else syn=10+15; p-;casesyn=12+15;(syn=13+15;)syn=14+15;syn=0;m=0;tokenm+=ch; if(ch= syn=

11、17+15; else if(ch= syn=16+15; syn=15+15; syn=19+15; syn=18+15; syn=21+15; syn=20+15;/syn=22+15;-syn=23+15;syn=24+15;default: syn=-1;void main() p=0; row=1; coutendlendl;*小型词法分析器*请输入一段程序(以#结束): do cin.get(ch); progp+=ch; while(ch!*词法分析结果如下* 种别编码 自身值 scaner(); switch(syn) case 22 : (syn , sum) case -1

12、: Error in rowrow!token#include #define DEFAULT_SIZE 100char EMachine(char w); /表达式E的自动机char TMachine(char w); /表达式T的自动机char FMachine(char w); /表达式F的自动机bool ZMachine(); /表达式Z的自动机string intToString(int a); /整形变成字符串形函数class stack /栈类定义private: int top; string *stacka; int maxsize;public: stack(int siz

13、e=DEFAULT_SIZE); stack() delete stacka; void push(const string &item); string pop(void); string gettop(void) const ; bool empty(void) const return (top=-1); bool full(void) const return (top=maxsize-1); void clear(void) top=-1;stack:stack(int size) /栈类的构造函数 top=-1; maxsize=size; stacka=new stringmax

14、size;stacka) cerrallocate memory failed. exit(1);void stack:push(const string &item) /压栈操作 if(full()stack full, cannot push. return; top+; stackatop=item;string stack:pop(void) /出栈操作 if(empty()stack empty, cannot pop. exit(1) ; string item=stackatop; top-; return item;gettop(void) const /取栈顶操作stack

15、empty, cannot gettop. return stackatop;static stack wordStack; /符号栈static int noOfQuet=0; /静态四元式个数记录static int noOfT = 1; /静态状态个数记录void main() /主函数 char yesOrNo; /进行一个循环操作控制 do coutyesOrNo; /输入“Y”则继续 while(yesOrNo=y /否则程序结束bool ZMachine() /Z自动机 char w;w; w = EMachine(w); /调用E自动机 if(w=) /遇到“#”则结束 ret

16、urn true; else return false;char EMachine(char w) /E自动机 string operate,a,b,c; string state5; w = TMachine(w); /调用T自动机 while(w=|w=) /是加或减符号 operate = w; /读入下一字符 w = TMachine(w); /调用T自动机 b = wordStack.pop(); /字符栈弹出 a = wordStack.pop(); /两个操作字符 (operateab,tnoOfT c = t+intToString(noOfT); /输出四元式 wordStack.push(c); /新状态压栈 noOfT+;

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

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