实验一 词法分析.doc_第1页
实验一 词法分析.doc_第2页
实验一 词法分析.doc_第3页
实验一 词法分析.doc_第4页
实验一 词法分析.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

实验一 词法分析一 实验目的和要求 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)二 实验内容(1,main)(5,()(5,)(5,)(1,int)(2,a)(5,,)(2,b)(2,c)(4,=)(3, 2)(5,;)(2,a)(4,=)(3,10)(5,;)(2,b)(4,=)(2,a)(4,+)(3,20)(5,;)(2,c)(4,=)(2,a)(4,+)(2,b)(4,/)(2,c)(5, ;)(5,)1 功能描述1.1 词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。如源程序为C语言。输入如下一段:main()int a,b,c=2;a = 10; b = a + 20; c = a + b/c;#要求输出如右图。1.2 单词的BNF表示 - -| | - - | - + - - - - =由此可知,需将单词分为五种:关键字1标识符2常数3运算符4分隔符5printfa0+,mainb1_;intc2*(ifstudent3/)thensum4=elsek5returnm6=8+”,当前字符为,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符+,这时可知应将解释为大于运算符。但此时,超前读了一个字符+,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。2 程序思路这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。0.定义部分:定义常量、变量、数据结构。1.初始化:从文件将源程序全部输入到字符缓冲区中。2.取单词前:去掉多余空白。3.取单词后:去掉多余空白(可选,看着办)。4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)5.显示结果。3 部分函数说明1. int lookup(char *TOKEN) 关键字匹配函数,查询所述程序中的关键字2. void out(int c,char *TOKEN) 输出函数3. void scanner(FILE *fp) 扫描函数,扫描程序中的字符串并调用lookup函数检查是否是关键字,再调用out函数输出二元组4.fseek(fp,-1,1) 回退一个字符5.zimu(ch) 字母判断函数,若ch指的是字母,返回非0,否则返回06.shuzi(ch) 数字判断函数,若ch指的是数字,返回非0,否则返回07.fgetc(fp) 从数据流中区下一个字符8.fopen 文件打开函数,返回指向文件第一个字符的指针三 实验过程记录及实验结果1 程序开始定义zimu(ch)和shuzi(ch)函数时,需要直接返回ch类型的值,不需要再定义变量,而我又重复定义了变量,所以程序出现错误。2 判断单词是关键字、标识符、整型常量、分隔符还是运算符时,关系到“回退”的概念,如果没有这个函数则运算结果会出现错误,即没有完全显示内容。如下图(a): 图(a) 图(b)3 实验结果如图(b)四 实验总结通过此次实验,使我意识到在做实验之前一定要认真复习课本内容和老师的要求以此来确定该实验要我们实现的是什么,怎么实现,每一步的步骤都要按照流程图认真的去完成,做实验不能有半点马虎。此外,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;实验核心的部分在于如何识别初各个单词的所属类别,实验前可先规划一下试验流程,这样编写起来比较方便容易。这次的实验使我熟悉了构造词法分析程序的手工方式的相关原理,也锻炼了自己编写算法以及C语言的能力,虽然在试验过程中存在着很多的不足,但经过老师以及同学的指点再加上自己的努力都一一克服了,今后我也会经常通过自己编写此类的代码来提高自己的能力。附录:源代码#include#include#include#include/定义关键字char *table7=continue,main,int,if,then,else,return,TOKEN20,ch; bool zimu(char ch)/判断是否为字母if(ch=a&ch=A&ch=0&ch=9)return true;elsereturn false;int lookup(char *TOKEN) /关键字匹配函数,查询所述程序中的关键字 int m,i;for(i=0;i) TOKEN0=ch; out(4,TOKEN); else if(ch=) TOKEN0=ch; out(4,TOKEN); else if(ch=) TOKEN0=ch; out(4,TOKEN); else if(ch=!=) TOKEN0=ch; out(4,TOKEN); /判断分隔符并输出else if(ch=,) TOKEN0=ch; out(5,TOKEN); else if(ch=;) TOKEN0=ch; out(5,TOKEN); else if(ch=) TOKEN0=ch; out(5,TOKEN); else if(ch=) TOKEN0=ch; out(5,TOKEN); else if(ch=() TOKEN0=ch; out(5,TOKEN); else if(ch=) TOKEN0=ch; out(5,TOKEN); main()FILE *fp;/读取文件内容,并返回文件指针,该指针指向文件的第一个字符if(fp=fopen(E:222.txt,r)=NULL) fprintf(stderr,error opening.n);exit(1);doch=fgetc(fp

温馨提示

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

评论

0/150

提交评论