编译原理课程设计 词法分析.docx

上传人:b****3 文档编号:5390927 上传时间:2023-05-08 格式:DOCX 页数:14 大小:195.90KB
下载 相关 举报
编译原理课程设计 词法分析.docx_第1页
第1页 / 共14页
编译原理课程设计 词法分析.docx_第2页
第2页 / 共14页
编译原理课程设计 词法分析.docx_第3页
第3页 / 共14页
编译原理课程设计 词法分析.docx_第4页
第4页 / 共14页
编译原理课程设计 词法分析.docx_第5页
第5页 / 共14页
编译原理课程设计 词法分析.docx_第6页
第6页 / 共14页
编译原理课程设计 词法分析.docx_第7页
第7页 / 共14页
编译原理课程设计 词法分析.docx_第8页
第8页 / 共14页
编译原理课程设计 词法分析.docx_第9页
第9页 / 共14页
编译原理课程设计 词法分析.docx_第10页
第10页 / 共14页
编译原理课程设计 词法分析.docx_第11页
第11页 / 共14页
编译原理课程设计 词法分析.docx_第12页
第12页 / 共14页
编译原理课程设计 词法分析.docx_第13页
第13页 / 共14页
编译原理课程设计 词法分析.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理课程设计 词法分析.docx

《编译原理课程设计 词法分析.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计 词法分析.docx(14页珍藏版)》请在冰点文库上搜索。

编译原理课程设计 词法分析.docx

编译原理课程设计词法分析

 

编译原理课程设计

词法分析程序

姓名:

*******

班级:

********************

学号:

************

日期:

2011-12-30

 

词法分析程序设计

课程设计目的:

运用所学习的知识和语言,设计编制和调试一个具体的词法分析程序,通过运行程序从而加深对词法分析的理解。

课程设计要求:

通过对PL/0词法分析程序(GETSYS)的分析,编制一个具有以下功能的词法分析程序:

a.输入待进行词法分析的源程序,输出为单词串,即由(单词,类别)所组成的二元组序列;

b.有一定的错误检查能力,例如能发现2a这类不能作为单词的字符串。

课程设计思路:

词法分析所能分辨的符号有,常数,字符,关键字,界符,运算符等类型,设计的程序要求可以分辨各种不同的类型,可以运用C语言文件操作的功能,导入一个已经存在的文本文件,对文本文件的内容进行此法分析,并且把分析结果导入到另外一个文件当中。

主要变量说明:

运用C语言的宏定义功能,1~11这十二个数字分别用来表示不同的关键字,12代表标示符类型ID,13代表常数类型INT,14代表界符类型JF,15代表运算符类型YSF。

定义一个长度为30的数组,用来存放标示符和常量。

设置指向固定文件的指针write和read,用来进行对文件的操作。

算法描述:

A.设置一个字符串匹配函数looksame,对于以字母开头的字符串,对其进行与关键字的匹配,如果对于匹配关键字的字符串,则将字符串识别为关键字。

B.设置一个字符类型和字符串输出函数out,把从文件中读出的字符串,以及它预定义的类型输出,同时将词法分析的一段结果输入到指定文件中,同时输出到命令窗口。

C.设置一个报错函数error,对于文件中未能够识别的字符进行报错处理,输入报错信息“书写格式错误,未被识别”。

D.设置功能函数function,进行具体的词法分析功能,不断对文件中的字符进行读出,按照字符串类型进判断分类,调用字符串匹配函数用来识别关键字,调用out函数,用来识别普通的常量以及标示符,同时对于界符和运算符进行识别,同时输出到指定的文件中。

在本函数中还设置了屏蔽注释内容的功能,因为注释并不实际参与程序的运行,设置屏蔽注释内容夫人功能,不把它反映在在此法分析的结果中。

E.运用主函数,对上面设置的函数进行调用,完成具体的词法分析功能。

F具体的程序代码:

/*该语言的关键字:

beginendifthenelsefordowhileandornot*/

/*该语言的界符:

;,:

,(,),{,}等/

/*该语言的运算符:

+,?

=,-,*,>,>=,<,<=等/

#include

#include

#include

#include

#defineID12

#defineINT13

#defineJF14

#defineYSF15

#defineN30

charTOKEN[N];

FILE*write;

intlooksame(char*a)

{

inti;

Char*key[22]={"begin","end","if","then","else","for","do","while","and","or","not",

"BEGIN","END","IF","THEN","ELSE","FOR","DO","WHILE","AND","OR","NOT"};

for(i=0;i<22;i++)

{

if(strcmp(key[i],a)==0)/*该字符串是否与关键字相匹配*/

return(i%11+1);

}

return0;

}

/*本函数的意思是,查询一个字符串,看其是否与指定的字符相匹配,如果匹配返回1个非零的值,如果不匹配,则返回一个0值*/

voidout(inta,char*b)

{

FILE*write;

write=fopen("E:

\\b.txt","a+");

if(write==NULL)

{

printf("文件打开失败");

exit(0);

}

fprintf(write,"%d\t",a);

fwrite(b,strlen(b),1,write);

fprintf(write,"\n");

fclose(write);

printf("%d%20s\t\t",a,b);

}

//这个函数的意思就是吧a输入到指定文件中,然后从该文件中读出字符串,放到一个数组中输出//

interror()

{

printf("书写格式错误,未被识别\n");

return0;

}

voidfunction(FILE*fp)

{

charch='';

inti,c;

while(ch!

=EOF)

{

ch=fgetc(fp);

while(ch==''||ch=='\t'||ch=='\n'){

ch=fgetc(fp);

}

if(isalpha(ch))//isalpha()判断是否为英文字母,是则返回非零值,否则返回零值//

{

TOKEN[0]=ch;

ch=fgetc(fp);

i=1;

while(isalnum(ch))//isalnum()判断字符是否为英文字母或数字,如果是则返回非零值,如果不是则返回零值//

{

TOKEN[i]=ch;

i++;

ch=fgetc(fp);}

TOKEN[i]='\0';

fseek(fp,-1,1);

c=looksame(TOKEN);

if(c==0)

{

out(ID,TOKEN);printf("标示符\n");

}

else

{

out(c,TOKEN);printf("关键字\n");

}

}

elseif(isdigit(ch))//isdigit()判断是否为a0-9的数字//

{

TOKEN[0]=ch;

ch=fgetc(fp);

i=1;

while(isdigit(ch))

{

TOKEN[i]=ch;

i++;

ch=fgetc(fp);

}

TOKEN[i]='\0';

fseek(fp,-1,1);

out(INT,TOKEN);

printf("常数\n");

}

else

{

switch(ch)

{

case'+':

out(YSF,"+");printf("运算符\n");

break;

case'-':

out(YSF,"-");printf("运算符\n");

break;

case';':

out(JF,";");printf("界符\n");

break;

case',':

out(JF,",");printf("界符\n");

break;

case'|':

out(YSF,"|");printf("运算符\n");

break;

case'{':

out(JF,"{");printf("界符\n");

break;

case'(':

out(JF,"(");printf("界符\n");

break;

case'!

':

out(JF,"!

");printf("界符\n");

break;

case'^':

out(JF,"^");printf("界符\n");

break;

case')':

out(JF,")");printf("界符\n");

break;

case'}':

out(JF,"}");printf("界符\n");

break;

case'<':

ch=fgetc(fp);

if(ch=='=')

{

out(YSF,"<=");

printf("运算符\n");

}

elseif(ch=='>')

{

out(YSF,"<>");

printf("运算符\n");

}

else

{

fseek(fp,-1,1);

out(YSF,"<");

printf("运算符\n");

}

break;

case'=':

out(YSF,"=");printf("运算符\n");

break;

case'>':

ch=fgetc(fp);

if(ch=='=')

{

out(YSF,">=");

printf("运算符\n");

}

else

{

fseek(fp,-1,1);

out(YSF,">");

printf("运算符\n");

}

break;

case':

':

ch=fgetc(fp);

if(ch=='=')

{

out(YSF,":

=");

printf("运算符\n");

}

else

{

fseek(fp,-1,1);

out(JF,":

");

printf("界符\n");

}

break;

case'/':

ch=fgetc(fp);

if(ch=='*')

{

out(JF,"/*");

printf("界符\n");

while

(1)//注释的内容不反应在词法分析中//{

while(ch!

='/')

ch=fgetc(fp);

fseek(fp,-2,1);

ch=fgetc(fp);

if(ch=='*')

{

fseek(fp,1,1);

break;

}

else

{

fseek(fp,2,1);

ch=fgetc(fp);

}

}

fseek(fp,-2,1);

}

else

{

fseek(fp,-1,1);

out(JF,"/");

printf("界符\n");

}

break;

case'*':

ch=fgetc(fp);

if(ch=='/')

{

out(JF,"*/");

printf("界符\n");

}

else

{

fseek(fp,-1,1);

out(YSF,"*");

printf("运算符\n");

}

break;

caseEOF:

break;

default:

error();

break;

}

}

}

}

intmain()

{

FILE*read;

read=fopen("E:

\\a.txt","r");

write=fopen("E:

\\b.txt","a+");

if(read==NULL)

{

printf("FILEOPENFAIL!

");//

exit(0);

}

printf("===========================================================\n");

printf("====================词法分析程序===========================\n");

printf("===========该分析程序的文件存放在D:

\\a.txt目录下==========\n");

printf("===========该程序的分析结果存放在D:

\\b.txt目录下===========\n");

printf("============================================================\n");

function(read);

fclose(read);

system("pause");

return0;

}

 

G,文件说明,程序中运用的两个文件存放在E盘中,文件名为a和b。

文件a的内容为:

程序运行的结果为:

文件b在执行后的内容变为:

实验心得体会:

这次课程设计频繁的使用了C语言中的文件操作函数,对这方面的知识有了更加深刻的了解,在设计过程中,对各种函数的使用也更加熟练,与此同时对编译原理中词法分析的功能有了更加深刻的了解和认识。

由于自己时间的原因,选择了一个比较简单的设计题目,在设计的过程中体会到了克服困难所带来的喜悦,如果再有类似的设计题目一定会好好的进行研究,肯定会使自己受益无穷,这次课程设计使我深深的认识到只要肯努力就没有克服不了的难关,希望自己以后不论是学习还是生活,都用这种不服输的态度去面对。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2