编译原理词法分析器实验报告2.docx

上传人:b****3 文档编号:3754047 上传时间:2022-11-25 格式:DOCX 页数:7 大小:96.40KB
下载 相关 举报
编译原理词法分析器实验报告2.docx_第1页
第1页 / 共7页
编译原理词法分析器实验报告2.docx_第2页
第2页 / 共7页
编译原理词法分析器实验报告2.docx_第3页
第3页 / 共7页
编译原理词法分析器实验报告2.docx_第4页
第4页 / 共7页
编译原理词法分析器实验报告2.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

编译原理词法分析器实验报告2.docx

《编译原理词法分析器实验报告2.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器实验报告2.docx(7页珍藏版)》请在冰豆网上搜索。

编译原理词法分析器实验报告2.docx

编译原理词法分析器实验报告2

《编译原理》

实验报告

——词法分析器

院系:

班级:

姓名:

学号:

词法分析器实验报告

一、实验目的:

设计一个词法分析程序,理解词法分析器实现的原理,掌握程序设计语言中的各类单词的词法分析方法,加深对词法分析原理的理解。

二、实验原理:

词法分析是从左向右扫描每行源程序的符号,拼成单词,换成统一的二元式(单词种别码,单词符号的属性值)表示。

对给定的程序通过词法分析器识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示,本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示)

三、实验说明:

(1)关键字:

"begin","end","if","then","else","while","write","read",

"do","call","const","char","until","procedure","repeat"

(2)运算符:

"+","-","*","/","="

(3)界符:

"{","}","[","]",";",",",".","(",")",":

"

(4)其他标记如字符串,表示以字母开头的标识符

(5)空格、回车、换行符跳过

(6)运行结果在屏幕上以如下格式显示:

1$无符号整数

begin$关键字

if$关键字

+$运算符

;$界符

a$普通标识符//“$“为美元符号,不是大写字母S

测试功能时,可以多次设置包含不同字符,关键字的待解析文件,但要保证输入文件和后缀名时准确无误,仔细察看运行结果,检测该分析器的分析结果是否正确

四、源代码:

#include

#include

usingnamespacestd;

#defineMAX22

charch='';

stringkey[15]={"begin","end","if","then","else","while","write","read",

"do","call","const","char","until","procedure","repeat"};

intIskey(stringc){//关键字判断

inti;

for(i=0;i

if(key[i].compare(c)==0)return1;

}

return0;

}

intIsLetter(charc){//判断是否为字母

if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))return1;

elsereturn0;

}

intIsDigit(charc){//判断是否为数字

if(c>='0'&&c<='9')return1;

elsereturn0;

}

voidanalyse(FILE*fpin){

stringarr="";

while((ch=fgetc(fpin))!

=EOF){

arr="";

if(ch==''||ch=='\t'||ch=='\n'){}

elseif(IsLetter(ch)){

while(IsLetter(ch)||IsDigit(ch)){

if((ch<='Z')&&(ch>='A'))ch=ch+32;

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

if(Iskey(arr)){cout<

elsecout<

}

elseif(IsDigit(ch)){

while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){

arr=arr+ch;

ch=fgetc(fpin);

}

fseek(fpin,-1L,SEEK_CUR);

cout<

}

elseswitch(ch){

case'+':

case'-':

case'*':

case'=':

case'/':

cout<

case'(':

case')':

case'[':

case']':

case';':

case'.':

case',':

case'{':

case'}':

cout<

case':

':

{ch=fgetc(fpin);

if(ch=='=')cout<<":

="<<"\t$运算符"<

else{cout<<"="<<"\t$运算符"<

fseek(fpin,-1L,SEEK_CUR);}

}break;

case'>':

{ch=fgetc(fpin);

if(ch=='=')cout<<">="<<"\t$运算符"<

if(ch=='>')cout<<">>"<<"\t$输入控制符"<

else{cout<<">"<<"\t$运算符"<

fseek(fpin,-1L,SEEK_CUR);}

}break;

case'<':

{ch=fgetc(fpin);

if(ch=='=')cout<<"<="<<"\t$运算符"<

elseif(ch=='<')cout<<"<<"<<"\t$输出控制符"<

elseif(ch=='>')cout<<"<>"<<"\t$运算符"<

else{cout<<"<"<<"\t$运算符"<

fseek(fpin,-1L,SEEK_CUR);}

}break;

default:

cout<

}

}

}

voidmain(){

charin_fn[30];

FILE*fine;

cout<<"请输入源文件名(包括路径和后缀名):

";

for(;;){

cin>>in_fn;

if((fpin=fopen(in_fn,"r"))!

=NULL)break;

elsecout<<"文件路径错误!

请输入源文件名(包括路径和后缀名):

";

}

cout<<"\n********************分析如下*********************"<

analyse(fpin);

fclose(fpin);

cout<

cout<<"按任意键结束"<

inta;

cin>>a;

}

运行结果截图:

输入:

输出:

 

生成的单词表目标文件:

 

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1