编译原理词法分析实验文档格式.docx
《编译原理词法分析实验文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析实验文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
![编译原理词法分析实验文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/13/1e9c1ad8-5870-44d8-a93e-248e6fa57190/1e9c1ad8-5870-44d8-a93e-248e6fa571901.gif)
词法分析器的功能是输入源程序,输出单词符号。
词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)
①识别保留字:
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.输入代码
3.执行代码
二.算法描述
#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.符号种别码:
3.分析结果:
4.程序说明:
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"
可以再程序中或者查看目标文件浏览词法分析结果,谢谢您的使用!
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"
三.流程
四.结论