




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验报告二词法分析一、总体设计思想1)实验目的:设计编制并调试一个词法分析程序,加深对构造词法分析器的原理和技术的理解与应用。2)实验具体要求:针对计算机高级程序语言C语言子语言,运用恰当的词法分析技术线路,设计和实现C语言子语言的词法分析器。Ø 编程语言:C语言/JAVA语言Ø 平台选择:Linux/WindowsØ 技术线路( 任选其一)n 正规式NFADFAmin DFA程序设计n 正规文法NFADFAmin DFA程序设计Ø 词法分析器程序输出形式,参见输出形式设计Ø 具有出错处理功能C语言子语言词法描述涉及的单词类如下:(1)关键字m
2、ain if else while do for int void char(2)运算符和界符=*<<=>>=!= =;():# 注:#为结束标志符,详见程序框架(3)标识符正规式:ID=letter(letter|digit)*(4)整型常数正规式:NUM= digit(digit)*3) 词法分析器构造原理: 词法分析器就是根据语言的此法规则构造出识别其单词的有限自动机,它是一个数学模型,先给出识别各类单词的状态转换图,再将各类单词的状态转换图的初始状态合并成一个唯一的初状态;然后化简并调整冲突的状态编号;最后再将有限自动机变成一个可行的词法分析器。二、种别码表设计
3、及其在计算机中存放表示 1)单词种别码设计:单 词 种 别 码 对 照 表单词符号种别码单词符号种别码main116if2:17else3=18while419do5<20for6! =21int7<=22char8>23void9>=24标识符10= =25整型常数11;2612(2713)2814#0* 152)输出形式设计:词法分析器的输入是源程序字符串,输出是对应的单词串。每个单词按照二元组(种别码,单词符号本身)格式输出。例如:假设源程序为main( ) x=9;y=4; if (x>0) x=2*x+1/3; #则词法分析器对应输出的结果是:(1,ma
4、in) (27,( ) (28,) ) (12, ) (10,x) (18,=) (11,9) (26,;) (10,y) (18,=)(11,4) (26,;) (2,if) (27,( ) (10,x) (23,>) (11,0) (10,x) (18,=) (11,2) (15,*) (10,x) (13,) (11,1) (16,) (11,3) (26,;) (19,) (0,#)三、词法分析程序详细设计1)算法构造思想:依据建立的识别单词的DFA,设计算法,其框架如下。其中, syn存放单词的种别码; token存放符合C语言子语言词法规则的单词; sum存放整型常量的单词。
5、 Prog存放所有输入的字符。 isSignal判断是否带正负号(0不带,1负号,2正号)。 isDecimal判断是否是小数。 isExp判断是否是指数。2)主要模块算法的框图描述:四、 主要代码#include<stdio.h> #include<string.h> #include<math.h> char prog80; /存放所有输入字符 char token32; /token存放符合C语言子语言词法规则的单词; char ch; /单个字符 int syn,p,m,n; / syn存放单词的种别码 double sum; /sum存放
6、整型常量的单词。 int count; int isSignal; /是否带正负号(0不带,1负号,2正号) int isDecimal; /是否是小数 double decimal; /小数 int isExp; /是否是指数 int index; /指数幂 int isNegative; /是否带负号 double temp; int temp2; int repeat; void scanner(); char *rwtab9="main", "if", "else", "while", "do&q
7、uot;, "for" , "int" , "char" , "void" void main() p=0; count=0; isDecimal=0; index=0; repeat=0; printf("nplease input a range of data, with the end of #:n"); do ch=getchar(); progp+=ch; while(ch!='#'); /输入以号键结束 p=0; do scanner(); /扫描,单词 switc
8、h(syn) case 11: if(isDecimal=0) /加了1个强制类型转换 printf("(%d,%d) ",syn,(int)sum); break; else if(isExp=1) printf("(%d,%e) ",syn,sum); isExp=0; isDecimal=0; break; else if(isDecimal=1) printf("(%d,%f) ",syn,sum); isDecimal=0; break; case -1: printf("输入错误:")printf(&q
9、uot; n "); break; default: printf("(%d,%s) ",syn,token); while(syn!=0); getchar(); void scanner() sum=0; decimal=0; m=0; for(n=0;n<8;n+) tokenn=NULL; ch=progp+; /从prog中读出一个字符到ch中 while(ch=' ') /跳过空字符(无效输入) ch=progp+; if(ch>='a')&&(ch<='z')|(ch&
10、gt;='A')&&(ch<='Z') /ch是字母字符 while(ch>='a')&&(ch<='z')|(ch>='A')&&(ch<='Z')|(ch>='0')&&(ch<='9') tokenm+=ch; /ch=>token ch=progp+; /读下一个字符 tokenm+='0' p-; /回退一格 syn=10; /如果
11、是"main", "if", "else", "while", "do", "for" , "int" , "char" , "void"标识符中的一个 for(n=0;n<9;n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; else if(ch>='0')&&(ch<='9') IsNum: if(isS
12、ignal=1) /tokenm+='-' while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' /ch中数字本身是当做字符存放的 ch=progp+; if(ch='.') isDecimal=1; ch=progp+; count=0; /之前忘了清零,123.123+123.123#两个浮点数就无法识别 while(ch>='0')&&(ch<='9') /pow(x,y)计算x的y次幂
13、temp=(ch-'0')*pow(0.1,+count); decimal=decimal+temp; /AddToDec(); ch=progp+; sum=sum+decimal; if(ch='e'|ch='E') isExp=1; ch=progp+; if(ch='-') isNegative=1; ch=progp+; while(ch>='0')&&(ch<='9') /指数 index=index*10+ch-'0' ch=progp+;
14、 /10的幂 /123e3代表123*10(3) /sum=sum*pow(10,index);是错误的 if(isNegative) sum=sum*pow(0.1,index); else sum=sum*pow(10,index); if(isSignal=1) sum=-sum; isSignal=0; p-; syn=11; else switch(ch) case '<': m=0; tokenm+=ch; ch=progp+; if(ch='=') syn=22; tokenm+=ch; else syn=20; p-; break; cas
15、e '>': m=0; tokenm+=ch; ch=progp+; if(ch='=') syn=24; tokenm+=ch; else syn=23; p-; break; case ':': syn=17; tokenm+=ch; break; case '+': temp2=progp; tokenm+=ch; if(temp2>='0')&&(temp2<='9')&&(repeat=1) isSignal=2; /isSignal正数
16、ch=progp+; repeat=0; goto IsNum; if(temp2='+')|(temp2='-')&&(repeat=0) /如果重复出现符号,才将后边的+,-视为正负号 repeat=1; /ch=progp+; syn=13; break; case '-': temp2=progp; tokenm+=ch; if(temp2>='0')&&(temp2<='9')&&(repeat=1) isSignal=1; ch=progp+;
17、 /读“-”下一个字符 repeat=0; goto IsNum; /转到数字的识别 if(temp2='+')|(temp2='-')&&(repeat=0) /如果重复出现符号,才将后边的+,-视为正负号 repeat=1; /预言会重复 /ch=progp+; /读下一个字符 syn=14; break; case '*': temp2=progp; tokenm+=ch; syn=15; break; case '/': syn=16; tokenm+=ch; break; case '=': syn=18; tokenm+=ch; break; case '': syn=26; tokenm+=ch; break; case '(': temp2=progp; tokenm+=ch; syn=27; break; case '': temp2=progp; tokenm+=ch; syn=12; break; case '': temp2=progp; tokenm+=ch; syn=19; break; case ')': syn=28; tokenm+=ch;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025展望:透视二手房交易中的“不公平合同”
- 2025融资租赁合同书范本
- 2025综合租赁合同范本汇编
- 2025电视剧演员聘用合同范本(经纪公司版)
- 2025年标准产品采购合同范本示例
- 2025苗木采购合同苗木采购合同示例
- 2025福建省三明泰宁国有林场梅口乡工区果园经营权承包合同
- 2025年关于出口合同与出口单证的探究与解析
- 2025建筑材料采购与运输合同书
- 2025广州装饰合同样本下载
- 采油工程试题及答案
- 小学科学阅读试题及答案
- 找最小公倍数案例北师大五年级下册数学
- 基因组学在临床的应用试题及答案
- 公司法公章管理制度
- 统编版2024-2025学年语文六年级下册期中测试卷试题(有答案)
- 企业供应商管理制度
- 新生儿早产儿个案护理
- 2024-2025学年人教版初中物理八年级下册期中检测卷(第七章-第九章)
- 维修人员管理奖惩制度3篇1
- 《2025年CSCO肾癌诊疗指南》解读
评论
0/150
提交评论