编译原理试验2词法分析器_第1页
编译原理试验2词法分析器_第2页
编译原理试验2词法分析器_第3页
编译原理试验2词法分析器_第4页
编译原理试验2词法分析器_第5页
免费预览已结束,剩余5页可下载查看

付费下载

下载本文档

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

文档简介

1、编译原理 实验 2 词法分析器一、实验目的1. 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。2. 掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方 法。3. 编制一个读单词的程序, 从输入的源程序中, 识别出各个具有独立意义的单词, 即 基本保留字、标识符、常数、运算符和分隔符五大类。并依次输出各个单词的内部编码及单 词符号自身值。 (遇到错误时可显示“ Error ”,然后跳过错误部分继续显示)二、词法分析的基础知识1. 词法分析器的功能和输出格式 词法分析器的功能是输入源程序, 输出单词符号。 词法分析器的单词符号常常表示 成以下的二元式 ( 单

2、词种别码, 单词符号的属性值 ) 。在本实验中, 采用的是一类符号一 种别码的方式。标识符的BNF表示:<标识符 >-> < 字母 ><字母数字串 ><字母数字串 >->< 字母 ><字母数字串>|<数字 ><字母数字串>| £ 无符号整数的BNF表示:<无符号整数 >-> < 数字 ><数字串 ><数字串 >-> < 数字 ><数字串 > | £运算符的BNF表示:<加法运算符

3、 >-> +<减法运算符 >-> -<大于关系运算符 >-> ><大于等于关系运算符 >-> >=2. 超前搜索 词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a > i ”,当前字符为“>”,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢? 显然, 只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符“+”,这时可知应将“ >”解释为大于运算符。但此时,超前读了一个字符“i ”,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似

4、情况。三、程序要求1. 程序输入示例:如源程序为 C 语言,输入如下一段:main()int a, b;a = 10;b = a+20;2. 程序输出示例:(2,“ main”)1,“ int ”)3,“ 10 ”)3. 具体要求如下:1)识别保留字: if 、int 、for 、 while 、do 、 return 、 break 、 continue 等。2)运算符包括: +、-、*、/ 、=、=、=、!=3)分隔符包括: , 、;、( 、)4)常数为无符号整形数;5)其它的都识别为标识符;4. 程序思路:( 1)定义部分:定义常量、变量、数据结构。( 2)初始化:从文件将源程序全部输入

5、到字符缓冲区中。( 3)取单词前:去掉多余空白。(4)取单词:读出单词的每一个字符,组成单词,分析类型,其中,关键是如何判断 取单词结束,取到的单词是什么类型的单词。( 5)显示结果。四、实验结果#include #include ""#include <>#define N 100#define M 20/ 定义要分析的标识符或常数的最大个数/ 标识符的长度char *sourceFile="D:" / 定义进行词法分析的源文件char *key8="if","else","for"

6、;,"while","do","return","break","continue"/ 关键字char *border6=",","","","","(",")" / 界符定义 char *arithmetic4="+","-","*","/" / 算术运算符定义 char *relation6=&

7、quot;<","<=","=",">",">=","<>" /关系运算符定义char *constsN; / 常数定义char *labelN;int constnum=0,labelnum=0; 标识符个数/ 标识符/ constnum- 常数个数 ;labelnum-/ 判断一个字符是不是字母int Isletter(char ch) if(ch>='a' && ch<='z'|ch&

8、gt;='A' && ch<='Z')return 1;return 0;/ 判断一个字符是不是数字int IsDigit(char ch)if(ch>='0' && ch<='9')return 1;return 0;/ 判断单词符号类型int search(char searchchar,int wordtype)int i=0;switch (wordtype)case 1:for (i=0;i<=7;i+)if(strcmp(keyi,searchchar)=0) r

9、eturn(i+1);case 2:for (i=0;i<=5;i+) if(strcmp(borderi,searchchar)=0) / return(i+1);return(0);case 3: for(i=0;i<=3;i+) if(strcmp(arithmetici,searchchar)=0) / 算符/ 返回具体的关键字返回具体的界符返回具体的算术运return(i+1);return(0);case 4:for(i=0;i<=5;i+)if(strcmp(relationi,searchchar)=0) 算符return(i+1);return(0);cas

10、e 5:for(i=0;i<constnum;i+)if(strcmp(constsi,searchchar)=0) / return(i+1);constsi=(char *)malloc(sizeof(searchchar); strcpy(constsi,searchchar);constnum+;return(i);case 6:for(i=0;i<labelnum;i+) if(labeli!=NULL) if(strcmp(labeli,searchchar)=0) return(i+1);labeli-1=(char *)malloc(sizeof(searchcha

11、r); strcpy(labeli-1,searchchar);labelnum+;return(i);return -1;/ 常数处理char digitprocess(char buffer,FILE* fp)int i=-1;char digittpM;int dtype;/ 返回具体的关系运返回具体的整型常数/ 返回标识符while (IsDigit(buffer)digittp+i=buffer; buffer=fgetc(fp);digittpi+1='0'dtype=search(digittp,5);printf("%s (5,%d)n",d

12、igittp,dtype-1);/ 输出整型常数return(buffer);/ 标识符或关键字char alphaprocess(char buffer,FILE* fp)int atype;int i=-1;char alphatpM;while (Isletter(buffer)|(IsDigit(buffer)alphatp+i=buffer; buffer=fgetc(fp);alphatpi+1='0'if (atype=search(alphatp,1)printf("%s (1,%d)n",alphatp,atype-1); elseatyp

13、e=search(alphatp,6);printf("%s (6,%d)n",alphatp,atype-1); return(buffer);/ 其它处理 (运算符 , 界符等 )char otherprocess(char buffer,FILE* fp)int i=-1;char othertpM;int otype,otypetp;othertp0=buffer;othertp1='0'/ 输出关键字/ 输出标识符if(otype=search(othertp,3)printf("%s (3,%d)n",othertp,otyp

14、e-1); buffer=fgetc(fp);goto out;if(otype=search(othertp,4) buffer=fgetc(fp); othertp1=buffer; othertp2='0'if(otypetp=search(othertp,4)printf("%s (4,%d)n",othertp,otypetp-1); goto out;else othertp1='0'printf("%s (4,%d)n",othertp,otype-1); goto out;if(buffer=':&

15、#39;) buffer=fgetc(fp); if (buffer='=') printf(":= (2,2)n");buffer=fgetc(fp);goto out;else if(otype=search(othertp,2) printf("%s (2,%d)n",othertp,otype-1); buffer=fgetc(fp);goto out;if(buffer!='n')&&(buffer!=' ')printf("%c error,not a wordn&qu

16、ot;,buffer); buffer=fgetc(fp); out: return(buffer);/ 文件指针 , 指向要分析的源/保存最新读入的字符/初始化标识符/ 初始化常数/ 判断源文件是否存在/ 读入字符/ 如果文件没有结束 , 就一直/ 若为字母/ 若为数字int main(int argc, char* argv)int i;FILE *fp; 程序char cbuffer;for (i=0; i<=N; i+) labeli=NULL; constsi=NULL; if(fp=fopen(sourceFile,"rb")=NULL)printf("文件 s不存在 ”,sourceF

温馨提示

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

评论

0/150

提交评论