编译原理_词法分析器_实验报告_第1页
编译原理_词法分析器_实验报告_第2页
编译原理_词法分析器_实验报告_第3页
编译原理_词法分析器_实验报告_第4页
编译原理_词法分析器_实验报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、词法分析器实验报告 实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理 解。 功能描述: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立 意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出 各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error !”,然后跳 过错误部分继续进行) 设计思想: 设计该词法分析器的过程中虽然没有实际将所有的状态转移表建立出来,但是 所用的思想是根据状态转移表实现对单词的识别。首先构造一个保留字表,然后,每 输入一个字符就检测应该进入什么状态,并将该字符连接到d串后继续输入,如此循

2、 环,最后根据所在的接受状态以及保留字表识别单词。 符号表: 记号 类别 属性值 WS - - const 保留字 1 var 保留字 1 call 保留字 1 begi n 保留字 1 if 保留字 1 while 保留字 1 do 保留字 1 odd 保留字 1 end 保留字 1 the n 保留字 1 procedure 保留字 1 = 运算符 2 运算符 2 = 运算符 2 运算符 2 运算符 2 = 运算符 2 * 运算符 2 + 运算符 2 - 运算符 2 / 运算符 2 := 运算符 2 ide nt 标识符 3 nu mber 常数 4 ( 分隔符 5 ) 分隔符 5 J 分

3、隔符 5 分隔符 5 分隔符 5 状态转换图: 标识符及保留字: letter or digitt nu mber: other other 关系操作符: (=,2) (,2) (=,2) (,2) 分隔符: (:=,2) 3 算术运算符: 使用环境: Windows xp 下的 visual C+6.0 程序测试: in putl : int a,b; a=b+2; in put2: while(a=0) do 7x=x+6.7E+23; end; in put3: beg in: x:=9 if x0 the n x:=x+1; while a:=0 do b:=2*x/3,c:=a; e

4、nd; output1: output2: output3: 3,i nt output2: output3: 3,a 1,while 1,begi n 5, 5,( error line 1 3,b 3,a 3,x 5,; 2,= 2,:= 3,a 4,0 4,9 2,= 5,) 1,if 3,b 1,do 3,x 2,+ error line 3 2, 4,2 2,= 4,0 5,; 3,x 1,then 2,+ 3,x 4,6.7E+23 2 := 5,; 3,x 1,e nd 2,+ 5,; 4,1 5,; 1, while 3,a 2, := 4,0 1,do 2,/ 5,; 3,b

5、 4,3 1,e nd 2,:= 5, 5,; 4,2 3,c 2,* 2 := J J 3,x 3,a 测试结果与预期结果一致 源程序代码: #in clude #in clude void mai n() int i=O,j,k=O,state=1,f=O,l inenum=1; char a1110=co nst,var,call,begi n,if,while,do,odd,e nd,the n,proc edure; char b,d4O=O; freope n(i nput.txt,r,stdi n); freope n(output.txt,w,stdout); b=getcha

6、r(); while(b!=EOF)/*判断所输入字符是否为结束符*/ if(b= |b=n|b=t)/*滤过空格、换行等分隔符号*/ if(b=n) linenu m+; b=getchar(); else if(b=a b=getchar(); for(j=0;j11;j+)/*查询保留字表确定该单词是否是保留字*/ if(strcmp(d,aj)=0) prin tf(1,%sn,d); k=1; break; if(k=0)/*在保留字表中没有查到该单词,是标识符*/ prin tf(3,%sn,d); for(j=0;j=0di+=b;b=getchar(); else state=

7、7; break; case 7: f=1;break; case 8: f=1;break; if(state=7 数字后接字母的出错控 else if(state=7 b=getchar(); prin tf(error line %dn ,li nenu m); else prin tf(error line %dn ,li nenu m); for(j=0;j=i;j+) dj=0; i=0; f=0; state=1; else if(b=)/* 识别、=和*/ di+=b; b=getchar(); if(b=|b=) di+=b; b=getchar(); prin tf(2,%

8、sn,d); for(j=0;j=i;j+) dj=0; i=0; else pri ntf(2,%sn,d); for(j=0;j)/*识别和=*/ di+=b; b=getchar(); if(b=) di+=b; b=getchar(); prin tf(2,%sn,d); for(j=0;j=i;j+) dj=0; i=0; else pri ntf(2,%sn,d); for(j=0;j=i;j+) dj=0; i=0; else if(b=:)/*识别:=*/ di+=b; b=getchar(); if(b=) di+=b; b=getchar(); prin tf(2,%sn,d); else prin tf(error line %dn,li nenu m); for(j=0;j=i;j+) dj=0; i=0; else if(b=*|b=+|b=-|b=7|b=)/*识别运算符 */ prin tf(2,%cn,b); b=getchar(); else if(b=(|b=)|b=,|b=;|b=.)/*识别分隔符 */ prin tf(5,%cn,b); b=getchar(); else prin tf(error line %dn ,li

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论