编译原理词法分析器Word文档下载推荐.docx
- 文档编号:21791510
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:15
- 大小:44.46KB
编译原理词法分析器Word文档下载推荐.docx
《编译原理词法分析器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
4
<
47
while
5
48
do
6
49
return
7
==
50
break
8
!
51
continue
9
61
ID
20
;
62
NUM
30
{
63
+
41
}
64
-
42
(
65
*
43
)
66
三、预习提示
1、模块结构参照教材105页图3.22。
四、实验过程和指导
1、准备
(1)课本有关章节;
(2)编制好程序;
(3)准备多组测试数据。
2、为了能设计好程序,注意以下事情:
(1)模块设计:
将程序分成合理的多个模块(函数),每个模块做具体的同一事情。
(2)设计方案:
模块关系简图、流程图、全局变量、函数接口等。
(3)编程时注意编程风格:
空行的使用、注释的使用、缩进的使用等。
五、举例
源程序文件内容如下:
main()
inta,b;
a=10;
b=a+20;
要求输出如下:
(1,0)
(65,0)
(66,0)
(63,0)
(3,0)
(20,a)
(61,0)
(20,b)
(62,0)
(45,0)
(30,10)
(41,0)
(30,20)
(64,0)
源程序:
#include<
stdio.h>
string.h>
stdlib.h>
structtest//保留字
charname[10];
intnum;
};
structoper//运算符与关系运算符
charname[4];
structcut//分隔符
charname[2];
//定义全局变量
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);
\n输入要将分析结果存入的文件名:
objectfile);
\n输入选择项:
%d"
&
choice);
for(;
;
{
switch(choice)
{
case1:
scansource();
break;
case2:
rule();
case3:
analyse();
case4:
explain();
case5:
exit
(1);
}
printf("
\n\n"
menu();
输入选择项:
scanf("
}
return0;
voidmenu()
/************************************************/\n"
词法分析器\n"
1.查看源文件\n"
2.符号种别码\n"
3.分析结果\n"
4.程序说明\n"
5.退出程序\n"
voidscansource()
FILE*fp;
charch;
if((fp=fopen(sourcefile,"
r"
))==NULL)
文件打开错误或源文件不存在!
\n"
exit
(1);
ch=fgetc(fp);
while(ch!
=EOF)
{
putchar(ch);
ch=fgetc(fp);
fclose(fp);
voidrule()
inti;
保留字及其对应种别码:
for(i=0;
i<
9;
i++)
(%s,%d)\t"
test[i].name,test[i].num);
运算符及其对应种别码:
11;
oper[i].name,oper[i].num);
分隔符及其对应种别码:
6;
cut[i].name,cut[i].num);
voidanalyse()
文件打开错误!
if((hp=fopen(objectfile,"
w"
do
if(((ch>
='
a'
)&
&
(ch<
z'
))||((ch>
A'
Z'
)))
getch(ch);
}
elseif((ch>
0'
9'
))
{//如果读取的是数字
getnum(ch);
Elseif((ch=='
'
)||(ch=='
\r'
\n'
\t'
getspace(ch);
else//其他情况
getelse(ch);
k=0;
str[k]='
\0'
}while(ch!
=EOF);
//关闭文件
fclose(hp);
voidexplain()
printf("
\n提示:
本程序是一个进行标准C语言词法分析的程序,在本程序执行的开始,你会看到一个菜单\n"
为了是程序正确的运行,请按照提示进行正确的输入,比如:
输入错误的源文件名会导致\n"
程序因找不到源文件而出错,所以请输入正确的文件名并将源文件与本程序放在同一目录\n"
下,结果将会存入输入的目标文件中,如果目标文件不存在,程序将会自动建立同名文件\n"
可以再程序中或者查看目标文件浏览词法分析结果,谢谢使用!
~(~o~)~zZ\n"
voidgetch(charch)
{
for(;
str[k]=ch;
str[++k]='
if(!
(((ch>
))))
fseek(fp,-1L,1);
{if(strcmp(str,test[i].name)==0)//测试是否为保留字{printf("
(%d,0)\n"
test[i].num);
fprintf(hp,"
k=0;
break;
if(k!
=0)//否则为变量
{printf("
(20,%s)\n"
str);
fprintf(hp,"
(20,%s)\n"
voidgetnum(charch)
if(!
((ch>
)&
(ch<
)))
fseek(fp,-1L,1);
(30,%s)\n"
fprintf(hp,"
(30,%s)\n"
break;
voidgetspace(charch)
if(!
((ch=='
voidgetelse(charch)
switch(ch)
case'
'
:
(61,0)\n"
'
(62,0)\n"
{'
(63,0)\n"
}'
(64,0)\n"
('
(65,0)\n"
)'
(66,0)\n"
+'
(41,0)\n"
-'
(42,0)\n"
*'
(43,0)\n"
/'
(44,0)\n"
str[k]=ch;
str[++k]='
if(ch!
fseek(fp,-1L,1);
printf("
(45,0)\n"
elseif(ch=='
(50,0)\n"
(46,0)\n"
(48,0)\n"
(47,0)\n"
(49,0)\n"
(51,0)\n"
程序运行效果:
主界面
查看源文件
符号及其种别码
分析结果
程序说明
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析器