编译原理词法分析实验.docx

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

编译原理词法分析实验.docx

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

编译原理词法分析实验.docx

编译原理词法分析实验

 

实验报告

 

2010至2011学年第2学期

 

课程名称

编译原理

学号

08070036

学生姓名

赵颖

年级

08级

专业

计算机科学与技术

教学班号

08计算机1班

实验地点

1509

实验时间

2011年4月12日第1节至第2节

主讲教师

辅导教师

实验

(一)

实验名称

词法分析器

软件环境

VC++6.0环境

硬件环境

实验目的

1掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。

2通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。

并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

3掌握根据程序的伪代码来编写程序模块程序源代码。

实验内容(应包括实验题目、实验要求、实验任务等)

一.实验题目:

词法分析器

二.实验要求:

用以下语言词法构造规则,来构造词法分析器。

词法分析器的功能是输入源程序,输出单词符号。

词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)

①识别保留字:

if、int、else、for、while、do、return、break、continue;单词种别码为1。

②其他的都识别为标识符,标识符由字母开头,后面可以是数字、字母和下划线;单词种别码为2。

③常数为无符号整形数,无符号的整数由数字开头,后面只包含数字;单词种别码为3。

④运算符包括:

+、-、*、/、=、>、<、>=、<=、<>;单词种别码为4。

⑤分隔符(界符)包括:

、;、{、}、(、);单词种别码为5。

程序输入/输出示例:

如源程序为C语言。

输入如下一段:

main()

{

inta,b;

a=10;

b=a+20;

}

三.实验任务

要求输出如图:

实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)

一.实验步骤

1.建立一个对话框的C++工程,取工程名为zhaoying。

2.输入代码

main()

{

inta,b;

a=10;

b=a+20;

}

3.执行代码

二.算法描述

#include

#include

#include

structtest//保留字

{

charname[10];

intnum;

};

structoper//运算符与关系运算符

{

charname[4];

intnum;

};

structcut//分隔符

{

charname[2];

intnum;

};

//定义全局变量

structtesttest[9]={

{"main",1},{"if",2},{"int",3},{"for",4},{"while",5},{"do",6},{"retuen",7},{"break",8},{"continue",9}

};

structoperoper[11]={

{"+",41},{"-",42},{"*",43},{"/",44},{"=",45},{">",46},{"<",47},{">=",48},{">=",49},{"==",50},{"!

=",51}

};

structcutcut[6]={

{",",61},{";",62},{"{",63},{"}",64},{"(",65},{")",66}

};

//包含的函数

voidmenu();//菜单

voidscansource();//查看源文件

voidrule();//查看输出规则

voidanalyse();//分析结果显示

voidexplain();

voidgetch(charch);//读取为字母

voidgetnum(charch);//读取为数字

voidgetspace(charch);//读取制表符类

voidgetelse(charch);//其他字符

charch;

charstr[10];

intk=0,i=0;

charsourcefile[20];//源文件名

charobjectfile[20];//目标文件名

FILE*fp;

FILE*hp;

intmain(intargc,char*argv[])

{

intchoice;

//显示菜单

menu();

printf("输入进行词法分析的源文件名:

");

scanf("%s",sourcefile);

printf("\n输入分析结果存入的文件名:

");

scanf("%s",objectfile);

printf("\n输入选项:

");

scanf("%d",&choice);

for(;;)

{

switch(choice)

{

case1:

scansource();

break;

case2:

rule();

break;

case3:

analyse();

break;

case4:

explain();

break;

case5:

exit

(1);

break;

}

printf("\n\n");

menu();

printf("输入选择项:

");

scanf("%d",&choice);

}

return0;

}

voidmenu()

{

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

printf("词法分析器\n");

printf("1.查看源文件:

\n");

printf("2.符号种别码:

\n");

printf("3.分析结果:

\n");

printf("4.程序说明:

\n");

printf("5.退出程序:

\n");

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

}

voidscansource()

{

FILE*fp;

charch;

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

{

printf("文件打开错误或源文件不存在!

\n");

exit

(1);

}

ch=fgetc(fp);

while(ch!

=EOF)

{

putchar(ch);

ch=fgetc(fp);

}

fclose(fp);

printf("\n");

}

voidrule()

{

inti;

printf("保留字及其对应种别码:

\n");

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

{

printf("(%s,%d)\t",test[i].name,test[i].num);

}

printf("\n");

printf("运算符及其对应种别码:

\n");

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

{

printf("(%s,%d)\t",oper[i].name,oper[i].num);

}

printf("\n");

printf("分隔符及其对应种别码:

\n");

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

{

printf("(%s,%d)\t",cut[i].name,cut[i].num);

}

printf("\n");

}

voidanalyse()

{

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

{

printf("文件打开错误!

\n");

exit

(1);

}

if((hp=fopen(objectfile,"w"))==NULL)

{

printf("文件打开错误!

\n");

exit

(1);

}

do

{

ch=fgetc(fp);

if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z')))

{

getch(ch);

}

elseif((ch>='0')&&(ch<='9'))

{//如果读取的是数字

getnum(ch);

}

elseif((ch=='')||(ch=='\r')||(ch=='\n')||(ch=='\t'))

{

getspace(ch);

}

else//其他情况

{

getelse(ch);

}

k=0;

str[k]='\0';

}while(ch!

=EOF);

fclose(fp);//关闭文件

fclose(hp);

printf("\n");

}

voidexplain()

{

printf("\n提示:

\n");

printf("本程序是一个进行标准C语言词法分析的程序,在本程序执行的开始,你会看到菜单\n");

printf("为了是程序正确的运行,请按照提示进行正确的输入,比如:

输入错误的源文件名会导致\n");

printf("程序因找不到源文件而出错,所以请输入正确的文件名并将源文件与本程序放在同一目录\n");

printf("下,结果将会存入输入的目标文件中,如果目标文件不存在,程序将会自动建立同名文件\n");

printf("可以再程序中或者查看目标文件浏览词法分析结果,谢谢您的使用!

\n");

printf("\n");

}

voidgetch(charch)

{

for(;;)

{

str[k]=ch;

str[++k]='\0';

ch=fgetc(fp);

if(!

(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||((ch>='0')&&(ch<='9'))))

{

fseek(fp,-1L,1);

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

{if(strcmp(str,test[i].name)==0)//测试是否为保留字{printf("(%d,0)\n",test[i].num);fprintf(hp,"(%d,0)\n",test[i].num);

k=0;

break;

}

}

if(k!

=0)//否则为变量

{printf("(20,%s)\n",str);fprintf(hp,"(20,%s)\n",str);

break;

}

break;

}

}

 

voidgetnum(charch)

{

for(;;)

{

str[k]=ch;

str[++k]='\0';

ch=fgetc(fp);

if(!

((ch>='0')&&(ch<='9')))

{

fseek(fp,-1L,1);

printf("(30,%s)\n",str);fprintf(hp,"(30,%s)\n",str);

break;

}

}

}

voidgetspace(charch)

{

for(;;)

{

ch=fgetc(fp);

if(!

((ch=='')||(ch=='\n')||(ch=='\t')||(ch=='\r')))

{

fseek(fp,-1L,1);

break;

}

}

}

voidgetelse(charch)

{

switch(ch)

{

case',':

printf("(61,0)\n");

fprintf(hp,"(61,0)\n");

break;

case';':

printf("(62,0)\n");

fprintf(hp,"(62,0)\n");

break;

case'{':

printf("(63,0)\n");

fprintf(hp,"(63,0)\n");

break;

case'}':

printf("(64,0)\n");

fprintf(hp,"(64,0)\n");

break;

case'(':

printf("(65,0)\n");

fprintf(hp,"(65,0)\n");

break;

case')':

printf("(66,0)\n");

fprintf(hp,"(66,0)\n");

break;

case'+':

printf("(41,0)\n");

fprintf(hp,"(41,0)\n");

break;

case'-':

printf("(42,0)\n");

fprintf(hp,"(42,0)\n");

break;

case'*':

printf("(43,0)\n");

fprintf(hp,"(43,0)\n");

break;

case'/':

printf("(44,0)\n");

fprintf(hp,"(44,0)\n");

break;

case'=':

str[k]=ch;

str[++k]='\0';

ch=fgetc(fp);

if(ch!

='=')

{

fseek(fp,-1L,1);

printf("(45,0)\n");

fprintf(hp,"(45,0)\n");

}

elseif(ch=='=')

{

printf("(50,0)\n");

fprintf(hp,"(50,0)\n");

}

break;

case'>':

str[k]=ch;

str[++k]='\0';

if(ch!

='=')

{

fseek(fp,-1L,1);

printf("(46,0)\n");

fprintf(hp,"(46,0)\n");

}

elseif(ch=='=')

{

printf("(48,0)\n");

fprintf(hp,"(48,0)\n");

}

break;

case'<':

str[k]=ch;

str[++k]='\0';

if(ch!

='=')

{

fseek(fp,-1L,1);

printf("(47,0)\n");

fprintf(hp,"(47,0)\n");

}

elseif(ch=='=')

{

printf("(49,0)\n");

fprintf(hp,"(49,0)\n");

}

break;

case'!

':

str[k]=ch;

str[++k]='\0';

if(ch!

='=')

{

fseek(fp,-1L,1);

}

elseif(ch=='=')

{

printf("(51,0)\n");

fprintf(hp,"(51,0)\n");

}

break;

}

}

三.流程

四.结论

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

当前位置:首页 > 自然科学 > 物理

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

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