




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、词法分析设计1. 实验目的 通过本实验的编程实践,了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。 2. 实验内容 用C+语言实现对C+语言子集的源程序进行词法分析。通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示 ;同时进行标识符登记符号表的管理。 3.实验原理本次实验采用NFA->DFA->DFA0的过程: 对待分析的简单的词法(关键词/id/num/运算符/
2、空白符等)先分别建立自己的FA,然后将他们用产生式连接起来并设置一个唯一的开始符,终结符不合并。待分析的简单的词法(1)关键字: "asm","auto","bool","break","case","catch","char","class","const","const_cast"等(2)界符(查表) "",",","(","
3、;)","","","",""(3) 运算符"*","/","%","+","-","<<","=",">>","&","","|","+","-","+=","-=",&quo
4、t;*=","/=","%=","&=","=","|="relop:(4) 其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。 id/keywords: digit: (5) 空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 空白、制表符和换行符:4.相关自动机描述DFA:DFA0: 5. 流程图5.核心数据结构描述(1)生成的token序列由name、type、attr保存。struct token s
5、tring name; string type; int attr; ; (2)本文的大多数数据结构都用map来保存,优点是查找方便,大大提高时间复杂度。 map<string,int> Keywords; /保存关键字 map<string,int> Sep; /保存界符map<string,int> Relop; /保存比较运算符map<string,int> Op; /保存其他运算符map<string,int>id; /保存输入字符串中的idmap<string,int>num; /保存数字vector<to
6、ken>Token; /保存token序列,大小未知,所以采用vector保存6.核心算法描述(1)void addToken(string s,int type)s为找到的字符串,type为可能类型。 将分析出来的token()序列添加到Token序列表中。如果是类型为1,查看关键词表,若找到,其类型为关键词并将其以类型为关键词存储到Token表中;若未找到,则查找id表,若找到,说明该id已经出现过,否则添加新的id到id表中,将该i字符串以类型为id添加到Token表中。如果类型为2,在界符表中查找,如果找到以类型为界符存储到Token表中,同理其他几种类型。可能类型为1-5,如果
7、出现其他类型表示是词法分析器中发现额错误,将错误信息记录下来。void addToken(string s,int type) switch(type)case 1: l_it=Keywords.find(s); if (l_it!=Keywords.end() token t=s,"keywords",l_it->second; Token.push_back(t); elsel_it=id.find(s); if (l_it=id.end() ids=idNum; token t=s,"id",idNum+; Token.push_back(t
8、); else token t=s,"id",l_it->second; Token.push_back(t); break;case 2:l_it=Sep.find(s); if (l_it!=Sep.end() token t=s,"separatrix",l_it->second; Token.push_back(t); break;case 3:l_it=Op.find(s); if (l_it!=Op.end() token t=s,"op",l_it->second; Token.push_back(t)
9、; break;case 4:l_it=Relop.find(s); if (l_it!=Relop.end() token t=s,"relop",l_it->second; Token.push_back(t); break;case 5: l_it=num.find(s); if (l_it=num.end() nums=nNum; token t=s,"num",nNum+; Token.push_back(t); else token t=s,"num",l_it->second; Token.push_back
10、(t); break; default: /error token t=s,"id",-1; Token.push_back(t); break; (2) void lexical() 词法分析器,按字符读入文法并对其进行处理。从状态0开始处理,如果是空白符则一直在状态0,如果第一个字符为字母,继续往后寻找,直至不是字母或是数字结束;若第一个字符为数字,将其拼凑成一个数字,数字可以有小数点等,详细见状态转换图,注意以数字开头容易出现一种例如3a类型的错误,所以以数字开头的一定要往下多找一个,看最后一个数字后面是否为空白符或界符或者其他允许出现的符号,如果后面紧跟着字母则报错
11、。如上同理分析运算符等。注意每次处理完遇到一个字符串都要将其送到addToken()添加到Token表中并回到状态0,继续往下处理。 void lexical()fstream ln("E:ln.txt"); char ch,tempch; int state=0; string s="",key="" while(!ln.eof() switch(state) case 0: ch=ln.get(); s=ch; if (ch=13|ch=10|ch=32|ch=9) state=0; s="" else if
12、(ch='<') state=1; else if (ch='=') state=6;else if (ch='>') state=9;else if (isLetter(ch) state=13;else if (isDigit(ch) state=15; else if (ch='+'|ch='-'|ch='*'|ch='/'|ch='&'|ch='|') state=20; tempch=ch; else if (ch=
13、9;') state=44; else if (isSep(ch)!=-1) state=47;else if (isOp(s)!=-1) state=48; else if (isRelop(s)!=-1) state=49; else state=50; /error break; case 1: ch=ln.get(); if(ch='='|ch='>') state=2; else if(ch='<') state=4; else state=5; break; case 2: s+=ch; addToken(s,4)
14、; state=0; break; case 4: s+=ch; addToken(s,3); state=0; break;case 5: /* addToken(s,4); ln.seekg(-1,ios:cur); state=0; break;case 6: ch=ln.get(); if(ch='=') state=7; else state=8; break;case 7: s+=ch; addToken(s,4); state=0; break;case 8: /* addToken(s,3); ln.seekg(-1,ios:cur); state=0; bre
15、ak;case 9: ch=ln.get(); if(ch='=') state=10; else if(ch='>') state=11; else state=12; break;case 10: s+=ch; addToken(s,4); state=0;break;case 11:s+=ch;addToken(s,3); state=0; break; case 12: /* state=0;addToken(s,4); ln.seekg(-1,ios:cur); break;case 13: ch=ln.get(); if(isDigit(ch)
16、|isLetter(ch) s+=ch; else state=14; break; case 14: /* state=0;addToken(s,1); ln.seekg(-1,ios:cur);break;case 15: ch=ln.get(); if (isDigit(ch) s+=ch; else if (ch='.')s+=ch; state=16; else state=18; break; case 16: ch=ln.get(); s+=ch;if (isDigit(ch) state=17; else state=50; /error break;case
17、17: ch=ln.get(); if (isDigit(ch) s+=ch; state=17; else state=18; break; case 18: /* if (isLetter(ch) s+=ch; state=50; elseaddToken(s,5); ln.seekg(-1,ios:cur); state=0; break;case 20: ch=ln.get(); if(ch=tempch|ch='=') state=21; else state=23; break;case 21: s+=ch; addToken(s,3); state=0; brea
18、k; case 23:addToken(s,3); ln.seekg(-1,ios:cur); state=0; break; case 44: ch=ln.get(); if (ch='=') state=45; else state=46; break;case 45: s+=ch; addToken(s,3); break; case 46:addToken(s,3); ln.seekg(-1,ios:cur); break;case 47:addToken(s,2); state=0; break; case 48:addToken(s,3); state=0;break; case 49: addToken(s,4); state=0; break; case 50: /error while(ch=l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗资源均衡分配-全面剖析
- 2025年脱硝催化剂项目投资风险评估报告
- 2025年空调过滤网项目投资风险评估报告
- 不锈钢酸洗钝化工艺流程与环保标准对接
- 青岛版五年级上册数学实践活动计划
- 电子产品质量检验与试验计划
- 小学课后辅导工作计划
- 巴南补漏维修施工方案
- 2025-2030中国草坪防护化学品行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国茯苓行业市场深度调研及发展趋势与投资前景预测研究报告
- 2024年安徽商贸职业技术学院单招职业适应性测试题库附答案
- TD/T 1075-2023 光伏发电站工程项目用地控制指标(正式版)
- 食品营养学(暨南大学)智慧树知到期末考试答案章节答案2024年暨南大学
- 2024年成都新都投资集团有限公司招聘笔试冲刺题(带答案解析)
- 冀教版二年级《数学》下册单元测试卷加答案
- 传统民艺的文化再生产靖西旧州壮族绣球的传承研究
- 彩虹 第1课时(公开课一等奖创新教学设计含反思)
- 2024EAU(新版)尿石病诊治指南要点
- 2024山东化学高考复习5 化学工业流程
- 康复医学治疗技术师考试(相关专业知识)真题及答案
- 中华人民共和国护士管理办法
评论
0/150
提交评论