编译原理词法分析源代码_第1页
编译原理词法分析源代码_第2页
编译原理词法分析源代码_第3页
编译原理词法分析源代码_第4页
编译原理词法分析源代码_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上一. 实验目的1 深入理解有限自动机及其应用2 掌握根据语言的词法规则构造识别其单词的有限自动机的方法3基本掌握词法分析程序的开发。二. 实验内容及要求1、 词法分析器的功能和输出格式词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。2、 单词的BNF表示<标识符>-> <字母><字母数字串><字母数字串>-><字母><字母数字串>|<数字><字母数字串&g

2、t;|<下划线><字母数字串>|<无符号整数>-> <数字><数字串><数字串>-> <数字><数字串> |<加法运算符>-> +<减法运算符>-> -<大于关系运算符>-> ><大于等于关系运算符>-> >=3、“超前搜索”方法词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a>+”,当前字符为>,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢?显然,只有知道下

3、一个字符是什么才能下结论。于是分析器读入下一个字符+,这时可知应将>解释为大于运算符。但此时,超前读了一个字符+,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。4、模块结构缓冲区扫描一个字符主函数main()N输入文件名,判断能否打开文件Y缓冲区中是否还有字符Y结束取单词扫描一个字符调用返回输出N5.程序思路 这里以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过词法分析后,源程序字符串(源程序的外部

4、表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。0.定义部分:定义常量、变量、数据结构。1.初始化:从文件将源程序全部输入到字符缓冲区中。2.取单词前:去掉多余空白。3.取单词后:去掉多余空白(可选,看着办)。4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?)5.显示结果。6.实验程序的源代码如下:#include <stdio.h>#include <ctype.h>#include <malloc

5、.h>#include <stdlib.h>#include <string.h>#define NULL 0FILE *fp;char cbuffer;char *key8="if","else","for","while","do","return","break","continue"char *border6=",","","","

6、;","(",")"char *arithmetic4="+","-","*","/"char *relation6="<","<=","=",">",">=","<>"char *consts20="0","1","2","3",&

7、quot;4","5","6","7","8","9"char *label20;int constnum=0,labelnum=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) return(i+1); break; case 2:for (i=0;i<=5;i+) if

8、(strcmp(borderi,searchchar)=0) return(i+1); return(0); break; case 3:for (i=0;i<=3;i+) if (strcmp(arithmetici,searchchar)=0) return(i+1); return(0); break; case 4:for (i=0;i<=5;i+) if (strcmp(relationi,searchchar)=0) return(i+1); return(0); break; case 5: for (i=0;i<=constnum;i+) if (strcmp

9、(constsi,searchchar)=0) return(i+1); break; case 6:for (i=0;i<=labelnum;i+) if (strcmp(labeli,searchchar)=0) return(i+1); labeli-1=(char *)malloc(sizeof(searchchar); strcpy(labeli-1,searchchar); labelnum+; return(i); break; char alphaprocess(char buffer) int atype; int i=-1; char alphatp20; while

10、 (isalpha(buffer)|(isdigit(buffer) alphatp+i=buffer; buffer=fgetc(fp); alphatpi+1='0' if (atype=search(alphatp,1) printf("%s t(1,%d)n",alphatp,atype-1);/结束 else atype=search(alphatp,6); printf("%s t(6,%d)n",alphatp,atype-1); return(buffer);char digitprocess(char buffer) i

11、nt i=-1; char digittp20; int dtype; while (isdigit(buffer) digittp+i=buffer; buffer=fgetc(fp); digittpi+1='0' dtype=search(digittp,5); printf("%s t(5,%d)n",digittp,dtype-1); return(buffer);char otherprocess(char buffer) int i=-1; char othertp20; int otype,otypetp; othertp0=buffer;

12、othertp1='0' if (otype=search(othertp,3) printf("%s t(3,%d)n",othertp,otype-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 t(4,%d)n",othertp,otypetp-1); goto out;

13、 else othertp1='0' printf("%s t(4,%d)n",othertp,otype-1); goto out; if (buffer=':') buffer=fgetc(fp); if (buffer='=') printf(":= (2,2)n"); buffer=fgetc(fp); goto out; else if (otype=search(othertp,2) printf("%s t(2,%d)n",othertp,otype-1); buffer=

14、fgetc(fp); goto out; if (buffer!='n')&&(buffer!=' ') printf("%c error,not a wordn",buffer); buffer=fgetc(fp);out: return(buffer);void main() int i; for (i=0;i<=20;i+) labeli=NULL; ; if (fp=fopen("example.txt","r")=NULL) printf("error"); elsecbuffer = fgetc(fp);while (cbuffer!=EOF) if (isalpha(cbuffer) cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess

温馨提示

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

评论

0/150

提交评论