C语言词法分析器构造实验报告_第1页
C语言词法分析器构造实验报告_第2页
C语言词法分析器构造实验报告_第3页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言词法分析器构造实验报告冯绍欣02 计算机(2)2002374203题目要求:完成一个C语言的词法分析器的构造。此词法分析器能识别附值语句、循环语句、条件语句、并能处理注释。选择要分析这个词法分析器分析的主要关键字有:main, int, float, char, if, else, for, while, do, switch, case, break; default的1、c文件,首先对其去掉注释和与空格处理,再根据字符的不同类型分析。全局数据结构:字符数组set:存放从文件中读到的所有字符;str:存放经过注释处理和预空格处理的字符;strtoken:存放当前分析的字符;结构体KEY

2、TABLE :存放关键字及其标号;全局字符变量 ch :当前读入字符;全局整型变量 sr, to:数组str, strtoken的指针。以层次图形式描述模块的组成及调用关系3、主要函数的设计要求(功能、参数、返回值):openfile :打开文件;GetChar :将下一个输入字符读到ch中,搜索指示器前移一字符位置;GetBC :检查ch中的字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符;Concat:将ch中的字符连接到 strtoken之后;IsLetter和IsDigit :布尔函数过程,分别判断ch中的字符是否为字母和数字;Reserve:整型函数过程,对st

3、rtoken中的字符串查找关键字表,若是关键字则返回编码,否则返回Retract :将搜索指示器回调一个字符位置,将ch置为空白字符;reflesh :刷新,把strtoken 数组置为空;prearra ngel :将注释部分置为空格;prearra nge2 :预处理空格,去掉多余空格;an alysis: 词法分析;main :主函数。4、状态转换图:203字b45字符a2981 字母或数字字符c字母非字母或数字数字.数字非数字字符a包括:=,& , | , + ,-字符b包括:-,< ,> ,| , *字符 c 包括:,:,(,), , , , , ! ,# , %

4、 ,”,/ , * , + ,-, > , <,.三、源代码如下:#i nclude <stdio.h>#in clude <stri ng.h>char set1000,str500,strtoke n20;char sig n5010,co nsta nt5010;char ch;int sr,to,id=0,st=0;typedef struct keytable /* 放置关键字 */char n ame20;int kind;KEYTABLE;KEYTABLE keyword= /* 设置关键字 */"main",0,"

5、;int",1,"float",2,"char",3,"if",4,"else",5,"for",6,"while",7,"do",8,"switch",9,"case",10,"break",11,"default",12,;openfile() /* 打开文件 */FILE *fp;char a,filename10;int n=0;printf("In

6、put the filename:");gets(filename);if(fp=fopen(filename,"r")=NULL)printf("cannot open file.n");exit(0);elsewhile(!feof(fp) /* 文件不结束,则循环 */a=getc(fp); /*getc 函数带回一个字符,赋给 a*/setn=a;/*文件的每一个字符都放入set数组中*/ n+;fclose(fp);/* 关闭文件 */setn-1='0'printf("nnSource Codenn&quo

7、t;);puts(set);printf("nn");reflesh() /* 清空 strtoken 数组 */to=0; /* 全局变量 to 是 strtoken 的指示器 */ strcpy(strtoken," ");prearrange1() /* 预处理程序 1*/int i,a,b,n=0;doif(setn='/' && setn+1='*')a=n; /* 记录第一个注释符的位置 */while(!(setn='*' && setn+1='/

8、9;)n+;b=n+1; /* 记录第二个注释符的位置 */for(i=a;i<=b;i+) /*/seti=' '/*把注释的内容换成空格,等待第二步预处理*/n+;while(setn!='0');prearrange2() /* 预处理程序 2*/int j=0;sr=O;/*全局变量sr是str的指示器*/doif(setj=' ' | setj='n')while(setj=' ' | setj='n') /* 扫描到有连续的空格或换行符 */ j+;str*/strsr='

9、 '/* 用一个空格代替扫描到的连续空格和换行符放入sr+;elsestrsr=setj; /* 若当前字符不为空格或换行符就直接放入 str*/ sr+;j+;while(setj!='0');strsr='0'char GetChar()/*把字符读入全局变量ch中,指示器sr前移*/ch=strsr;sr+;return(strsr-1);void GetBC() /*开始读入符号,直至第一个不为空格 */while(ch=' ')ch=GetChar();Concat() /* 把 ch 中的字符放入 strtoken*/strt

10、okento=ch;to+; /* 全局变量 to 是 strtoken 的指示器 */ strtokento='0'int IsLetter()/* 判断是否为字母 */if(ch>=65 && ch<=90)|(ch>=97 && ch<=122) return(1);else return(0);int IsDigit() /*判断是否为数字 */if(ch>=48 && ch<=57)return(1);else return(0);1*/int Reserve() /* 对 strto

11、ken 中的字符串查找保留字表,若是则返回它的编码,否则返回int i,k=0;for(i=0;i<=20;i+)if(strcmp(strtoken,)=0) k=1;return(keywordi.kind);if(k!=1)return(-1);void Retract() /* 指示器 sr 回调一个字符位置,把 ch 置为空 */sr-;ch=' 'int InsertId()int i,k;for(i=0;i<id;i+)k=strcmp(strtoken,signi);if(k=0)return(i);strcpy(signi

12、d,strtoken); /* 插入标识符 */id+;return(id-1);int InsertConst()int i,k;for(i=0;i<st;i+)k=strcmp(strtoken,constanti);if(k=0)return(i);strcpy(constantst,strtoken); /* 插入常数 */st+;return(st-1);void analysis()int value;/* 清空 strtoken 数组 */*预处理,使注释内容换成单个空格,放回set中*/*预处理,使set中连续的空格置换成单个空格,并把set的内容放到str中*/refl

13、esh();prearrange1();prearrange2();sr=0;GetChar();GetBC();/* 读取第一个字符 */while(ch!='0') /* 当不等于结束符,继续执行 */if(IsLetter()while(IsLetter() | IsDigit() /* 若第一个是字符,继续读取,直到出现空格*/Concat();GetChar();Retract();/*指示器sr回调一个字符位置,把 ch置为空*/value=Reserve();/*对strtoken中的字符串查找保留字表,若是则返回它的编码,否则返回一1*/if(value=-1)

14、/*如果返回值是 1 ,那就是变量,把它输出 */InsertId();/* 插入标识符 */ printf("n%s",strtoken);getch();else /* 否则就是关键字,也输出 */printf("n%s",strtoken); getch();reflesh();else if(IsDigit()while(IsDigit() /* 否则,若第一个是数字,继续读取,知道出现空格 */Concat();GetChar();/* 插入常数 */Retract();InsertConst();printf("n%s",

15、strtoken);getch(); reflesh();elseswitch(ch)/* 否则,若是下面的符号,就直接把它输出 */ case ',':case '':case '(':case ')':case '':case '':case '':case '':case '!':case '#':case '%': case '"': case '/': case 

16、9;*':Concat();printf("n'%s'",strtoken);getch(); reflesh();break;default:if(ch='=' | ch='&' | ch='|' | ch='+' | ch='-')/* 如果是这些符号,继续读取下一个 */Concat();/* 判断是否为 =,&&,|,+,- 的情况 */GetChar();if(ch=strtoken0)Concat();elseRetract();pri

17、ntf("n'%s'",strtoken);getch(); reflesh(); break;GetChar();GetBC();main()clrscr();openfile();analysis();printf( “analysis is over! ”); 五、测试结果: 1、分析文件 test1.c 中的程序: Input the filename:test.celse if(ch='+' | ch='-' | ch='<' | ch='>' | ch='!

18、9; | ch='*')Concat();/* 判断是否为 +=,-=,<=,>=,!=,*= 的情况 */GetChar();if(ch='=')Concat();elseRetract();printf("n'%s'",strtoken);getch();reflesh();break;elseprintf("Error!");getch();break;*Original Code* /* HELLO.C - Hello, world */#include "stdio.h"#include "conio.h" main()printf("Hello, worldn"); getch();*'#' includeIllistdioI IhIlli'#' in

温馨提示

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

最新文档

评论

0/150

提交评论