C语言词法分析器构造实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言词法分析器构造实验报告

02计算机(2)2002374203 冯绍欣

一、题目要求:

完成一个C语言的词法分析器的构造。此词法分析器能识别附值语句、循环语句、条件语句、并能处理注释。

二、设计方案:

这个词法分析器分析的主要关键字有:main, int, float, char, if, else, for, while, do, switch, case, break; default。选择要分析的c文件,首先对其去掉注释和与空格处理,再根据字符的不同类型分析。

1、全局数据结构:

字符数组set[ ]:存放从文件中读到的所有字符;

str[ ]:存放经过注释处理和预空格处理的字符;

strtoken[ ]:存放当前分析的字符;

结构体KEYTABLE:存放关键字及其标号;

全局字符变量ch:当前读入字符;

全局整型变量sr, to:数组str, strtoken 的指针。

2、以层次图形式描述模块的组成及调用关系

3、主要函数的设计要求(功能、参数、返回值):

openfile:打开文件;

GetChar:将下一个输入字符读到ch中,搜索指示器前移一字符位置;

GetBC:检查ch中的字符是否为空白。若是,则调用GetChar直至ch中进入一个非空白字符;

Concat:将ch中的字符连接到strtoken之后;

IsLetter 和IsDigit:布尔函数过程,分别判断ch中的字符是否为字母和数字;

Reserve:整型函数过程,对strtoken中的字符串查找关键字表,若是关键字则返回编码,否则返回-1;

Retract:将搜索指示器回调一个字符位置,将ch置为空白字符;

reflesh:刷新,把strtoken数组置为空;

prearrange1:将注释部分置为空格;

prearrange2:预处理空格,去掉多余空格;

analysis:词法分析;

main:主函数。

4、状态转换图:

字符a包括:= , & , | , + , --

字符b包括:-- , < , > , | , *

字符c包括:, , : , ( , ) , { , } , [ , ] , ! ,# , % , ” , / , * , + , -- , > , <, .

三、源代码如下:

#include

#include

char set[1000],str[500],strtoken[20];

char sign[50][10],constant[50][10];

char ch;

int sr,to,id=0,st=0;

typedef struct keytable /*放置关键字*/

{

char name[20];

int kind;

}KEYTABLE;

KEYTABLE keyword[]={ /*设置关键字*/

{"main",0},

{"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,filename[10];

int n=0;

printf("Input the filename:");

gets(filename);

if((fp=fopen(filename,"r"))==NULL)

{

printf("cannot open file.\n");

exit(0);

}

else

while(!feof(fp)) /*文件不结束,则循环*/

{

a=getc(fp); /*getc函数带回一个字符,赋给a*/

set[n]=a; /*文件的每一个字符都放入set[]数组中*/

n++;

}

fclose(fp); /*关闭文件*/

set[n-1]='\0';

printf("\n\n-------------------Source Code--------------------------\n\n");

puts(set);

printf("\n--------------------------------------------------------\n");

}

reflesh() /*清空strtoken数组*/

{

to=0; /*全局变量to是strtoken的指示器*/

strcpy(strtoken," ");

}

prearrange1() /*预处理程序1*/

{

int i,a,b,n=0;

do

{

if(set[n]=='/' && set[n+1]=='*')

{

a=n; /*记录第一个注释符的位置*/

while(!(set[n]=='*' && set[n+1]=='/'))

n++;

b=n+1; /*记录第二个注释符的位置*/

for(i=a;i<=b;i++) /**/

set[i]=' '; /*把注释的内容换成空格,等待第二步预处理*/ }

n++;

}while(set[n]!='\0');

}

prearrange2() /*预处理程序2*/

{

int j=0;

sr=0; /*全局变量sr是str[]的指示器*/

do

相关文档
最新文档