- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
目录
一、 实验题目 3
二、 实验目的 3
三、 实验要求 4
四、 实验步骤 4
基本设计思路 4
流程框图 5
算法设计 6
函数相关说明 6
输入与输出 8
程序运行结果 9
五、 实验方案设计实现 9
六、 实验程序亮点描述 10
七、 实验程序使用说明 10
八、 实验心得体会 10
九、 源程序清单 10
实验题目
设计、编制、调试一个识别一简单语言单词的词法分析程序。程序能够识别基本字、标识符、无符号整数、浮点数、运算符和界符)。单词符号及种别表如下:
单词符号
种别编码
begin
1
if
2
then
3
while
4
do
5
end
6
l(l|d)*
10
dd*
11
+
13
-
14
*
15
/
16
:
17
:=
18
20
21
=
22
23
=
24
=
25
;
26
(
27
)
28
#
0
实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
实验要求
词法分析程序需具备词法分析的功能:
输入:所给文法的源程序字符串。(字符串以“#”号结束)
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。
例如:对源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……
实验步骤
基本设计思路
基本字作为一类特殊的标识符来处理:识别出标识符,差基本字表,给出相应种别码。基本字表置初值:char *rwtab[6]={begin,if,then,while,do,end};(字符指针的数组)
识别无符号整数是将数字串转换为无符号整数。我们在getchar()的时候是把数字当做字符从外部输出读取的。将数字串345#转换为整数:
(3*10+4)*10+5=345送到sum中
程序主要由2个函数组成,主函数main()和扫描子函数scanner()。扫描程序每次读取1个独立意义的单词符号,并判断单词类型。主程序做相应处理后做控制台输出。
流程框图
图 1主程序
图 2扫描子程序
算法设计
词法分析程序所用的较为重要的全局变量和需调用的函数如下:
ch字符变量,存放当前读进的源程序字符。
token[8]字符数组,存放构成单词符号的字符串。
prog[80]字符数组,存放所有用户输入的字符。
syn整数,存放当前单词的种别码。
sum双精度浮点型变量,存放无符号整数,或者浮点数。
isDecimal整数,是否为浮点数。isDecimal为1,则为浮点数。
decimal双精度浮点型变量(double),浮点数的小数部分。
isExp整数,是否为指数形式表示的浮点数(即是否存在符号E或者e)。isExp为1,则为指数形式。
index整数,指数形式的幂。
isNegative整数,是否为负数幂。isNegative为1,则为负数幂,如123E-2。
scanner()扫描子程序。
getchar()从控制台读取一个字符数据。
double pow(double x,double y),计算x的y次幂。
int strcmp(char *str1,char #str2),字符串比较。
函数相关说明
接收用户输入:getchar()和do…while循环的组合
do{
ch=getchar();
prog[p++]=ch;
}while(ch!=#); //输入以#号键结束
输出到控制台:do…while循环中,扫描出单词后(扫描程序还会判断种别码syn)输出。
do{
scanner(); //扫描,单词
switch(syn)
{
case 11:
if(isDecimal==0)
{
printf((%2d,%8d)\n,syn,(int)sum);
break;
}
else if(isExp==1)
{
printf((%2d,%10.5e)\n,syn,sum);
isExp=0;
isDecimal=0;
break;
}
else if(isDecimal==1)
{
printf((%2d,%8.4f)\n,syn,sum);
isDecimal=0;
break;
}
case -1:
printf(input error\n);
break;
default:
printf((%2d,%8s)\n,syn
文档评论(0)