编译原理第一次上机实验报告软工李U172xxWord文档下载推荐.docx
- 文档编号:21880118
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:73.97KB
编译原理第一次上机实验报告软工李U172xxWord文档下载推荐.docx
《编译原理第一次上机实验报告软工李U172xxWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理第一次上机实验报告软工李U172xxWord文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
while
9
l(l|d)*
10
内部字符串
(+|-|ε)dd*(.dd*|ε)(e(+|-|ε)dd*|ε)
20
二进制数值表示
=
21
+
22
-
23
*
24
/
25
(
26
)
27
{
28
}
29
30
;
31
>
32
33
<
34
35
==
36
!
37
#
(2)词法分析器功能及基本要求
处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。
(1)总体设计思想
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字种类,拼出相应的单一符号;
(2)详细算法设计
当ch!
=’$’时,while循环扫描输入的每一个字符;
跳过空格、换行、注释;
如果是字符,则拼字符串;
判断是否为关键字,是则输出对应关键字的单词种别码,否则表明是l(l|d)*即内部字符串;
如果是数字,则拼数,整型、浮点型、指数;
如果是运算符、界符,输出相应种别码;
算符中应该注意+号和-号,做出相应判断是运算符还是表示数字的正负号;
如果是表示正负号则调到判断数字的地方;
其他则报错;
(3)流程框图
(4)函数相关说明
voidmain()主函数
voidscanner()扫描判断函数
charinput[300];
//存放输入的字符串
chartoken[20];
//存放符合C语言词法规则的单词
charch;
//单个字符
charprevious;
//ch的前一个字符
charlatter;
//ch的后一个字符
charch1,ch2;
//当处理注释的时候使用
inttypenum;
//表示单词的种别码
intp,m,n,cx;
doubledecimal;
//记录小数
doublesum;
//存放数字
intindex;
//存放指数
intisNum;
//是否是数字
intisDecimal;
//记录是否为小数
intisExp;
//记录是否为指数
intisNegative;
//是否带负号(对于指数)
intisNegative1;
//是否为负数
(5)输入与输出(包括出错处理)
输入以$结束回车即可运行程序
输出以(xxx,typenumber)的形式;
出错则会报error!
例如:
输入:
a+b=5$
输出:
(10,a)(22,+)(10,b)(21,=)(20,5)(0,$)
(6)程序运行结果(屏幕截图)
1.+++-123.456e-127*+45.99e+200++abc+-cnt++49
(7)词法分析器使用说明
打开编译器VS或者VC++;
文件新建项目;
将代码复制粘贴,编译运行,按照提示输入即可使用;
(8)心得与体会
提高了自己的编程能力,在上机实验中,特别是后期细节的处理很繁琐,需要很多的判断,判断+、-号是否为数字正负号时需要判断前面和后面的字符;
又分为好几种情况,每一种情况的判断语句很长容易出错;
同时还有指数的处理,e/E后面需要判断正负号以及把字符转换成数字以及识别数字的DFA和运算符加减等融合在一起;
(9)源程序清单
//词法编译器01.cpp:
定义控制台应用程序的入口点。
//
#include"
stdafx.h"
#include<
stdio.h>
string.h>
math.h>
voidscanner();
char*rwtab[11]={"
main"
"
int"
float"
double"
char"
if"
else"
while"
do"
end"
};
voidmain()
printf("
请输入词法:
(以$结束)"
);
p=0;
do
{
ch=getchar();
input[p++]=ch;
}while(ch!
='
$'
scanner();
switch(typenum)
{
case20:
if((isDecimal==0)&
&
(isExp==0))
printf("
(%d,%d)\n"
typenum,int(sum));
elseif((isDecimal==1)&
(%d,%f)\n"
typenum,sum);
elseif(isExp==1)
(%d,%e)\n"
break;
case-1:
printf("
(%d,Error!
)\n"
typenum);
default:
(%d,%s)\n"
typenum,token);
}
}while(typenum!
=0);
getchar();
voidscanner()
cx=0;
//用来记录小数点后面的位数
m=0;
sum=0;
decimal=0;
index=0;
isDecimal=0;
isNegative=0;
isNegative1=0;
isExp=0;
for(n=0;
n<
8;
n++)
token[n]='
\0'
ch=input[p++];
//处理回车换行空格
while((ch=='
'
)||(ch==9)||(ch==10))
ch=input[p++];
}
//处理注释
if(ch=='
/'
ch1=input[p];
if(ch1=='
*'
do
{
ch=input[p++];
ch2=input[p];
}while((ch!
)||(ch2!
));
p=p+1;
ch=input[p++];
}
if(((ch>
a'
)&
(ch<
z'
))||((ch>
A'
Z'
)))//如果当前ch为字母
while(((ch>
0'
9'
)))
token[m++]=ch;
token[m++]='
typenum=10;
//10表示l(l|d)*
p=p-1;
//回退一步
for(n=0;
n<
10;
if(strcmp(rwtab[n],token)==0)
typenum=n+1;
elseif((ch>
))
isNum:
while((ch>
sum=sum*10+(ch-'
if(ch=='
.'
isDecimal=1;
while(ch>
&
ch<
cx=cx+1;
decimal=decimal*10+(ch-'
}
if(ch=='
typenum=-1;
return;
for(inta=0;
a<
cx;
a++)
decimal=decimal*0.1;
sum=sum+decimal;
if((ch=='
e'
)||(ch=='
E'
isExp=1;
-'
isNegative=1;
//表示指数为负数
+'
isNegative=0;
//表示指数为正
while((ch>
index=index*10+(ch-'
if(isNegative==1)//如果指数为负数
for(intk=0;
k<
index;
k++)
sum=sum*0.1;
else
sum=sum*10;
if(isNegative1==1)
sum=sum*(-1);
p--;
typenum=20;
//表示为数字
//运算符、界运算符
else{
switch(ch)
case'
='
:
typenum=21;
case'
previous=input[p-2];
latter=input[p];
//当+号前面为空或者(或者=并且后面为数字时,+表示正负号;
if(((previous=='
)||(previous=='
('
))&
((latter>
(latter<
isNegative1=0;
//表示此+号为正负号
gotoisNum;
//当+号前面为+、-、*、/号且后面为数字时,-号表示正负号;
elseif(((previous=='
)||(previous=='
((latter>
//如果+号后面是+、-号,则表示为加减号
elseif((latter=='
)||(latter=='
typenum=22;
token[m++]=ch;
break;
//如果+号后面是字母;
elseif(((latter>
))||((latter>
elseif((((previous>
(previous<
))||((previous>
)))&
=0)||(latter<
previous=input[p-2];
//当-号前面为空或者(或者=并且后面为数字时,-表示正负号;
if(((previous=='
isNegative1=1;
//当-号前面为+、-、*、/号且后面为数字时,-号表示正负号;
elseif(((previous=='
//如果-号后面是+、-号,则表示为加减号
typenum=23;
//如果-号后面是字母;
//如果前面为字母或者数字且后面为数字,则表示-号
typenum=24;
typenum=25;
'
typenum=33;
typenum=32;
p--;
typenum=35;
typenum=34;
typenum=26;
)'
typenum=27;
{'
typenum=28;
}'
typenum=29;
typenum=30;
typenum=31;
=='
typenum=36;
typenum=37;
typenum=0;
typenum=-1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 第一次 上机 实验 报告 软工李 U172xx