编译原理实验一.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:24 大小:207KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

编译原理实验一.doc

编译原理实验一.doc

预览

免费试读已结束,剩余 14 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验内容:实现标准C语言词法分析器实验目的:1.掌握程序设计语言词法分析的设计方法;2.掌握DFA的设计与使用方法;3.掌握正规式到有限自动机的构造方法;实验要求:1.单词种别编码要求基本字(关键字)、运算符、界符:一符一种;标识符(变量名):统一为一种;常量():按类型编码;2.词法分析工作过程中建立符号表、常量表,并以文本文件形式输出;3.词法分析的最后结果以文本文件形式输出;4.完成对所设计词法分析器的功能测试,并给出测试数据和实验结果;5.为增加程序可读性,请在程序中进行适当注释说明;6.整理上机步骤,总结经验和体会;7.认真完成并按时提交实验报告。二、设计方案:这个词法分析器分析的主要关键字有:main,int,float,char,if,else,for,while,do,switch,case,break;default……。选择要分析的c文件,首先对其去掉注释和与空格处理,再根据字符的不同类型分析。1、全局数据结构:*key[]:关键字表全局文件指针*fr,*fw,*temp1,*temp2用于文件的读写。2、以层次图模块的组成及调用关系Main()check()isLet()clock()isBoudany()isKey()isNum()3、主要函数的设计要求(功能、参数、返回值):isKey:判断ch中的字符是否为关键字;isLer和isNum:布尔函数过程,分别判断ch中的字符是否为字母和数字;isBoudany():布尔函数过程,分别判断ch组成的字符否为边界符号;check:词法分析;clock:时间函数,计算程序运行所需的时间main:主函数。4、状态转换图:61字母或数字字母非字母或数字702数字数字非数字83字符a字符a94字符b‘=’5字符c字符a包括:=,&,|,+,--字符b包括:--,<,>,|,*字符c包括:,,:,(,),{,},[,],!,#,%,”,/,*,+,--,>,<,.#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#include<ctype.h>FILE*fr,*fw,*temp1,*temp2;char*key0[]={"main","printf","scanf","else","if","auto","double","int","struct","break","long","switch","case","enum","register","typedef","char","extern","return","union","const","float","short","unsigned","continue","for","signed","void","default","goto","sizeof","volatile","do","while","static"};/*关键字表*/char*key1[]={"\"","\\","(",")","[","]","{","}",",",";","'"};/*边界符表*/intisLet(charc)//判断是否是字母{if(c>='a'&&c<='z'||c>='A'&&c<='Z')return1;elsereturn0;}intisNum(charc)//判断是否是数字{if(c>='0'&&c<='9')return1;elsereturn0;}intisKey(char*word){intm,i;for(i=0;i<36;i++){if((m=strcmp(word,key0[i]))==0){if(i==0)return2;elsereturn1;}}return0;}intisBoudany(charc){if(c=='\\')return2;elseif(c=='('||c==')'||c=='{'||c=='}'||c=='['||c==']'||c==','||c==';'||c=='\''||c=='\"'||c=='\"')return1;elsereturn0;}voidcheck(FILE*fr){charword[30];while(!feof(fr)){memset(word,0,sizeof(word));