- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
《编译原理》实验报告
——之词法分析程序
姓名:卢旭
学号:U200917806
班级:软工0901班
2011年10月22日
目录
TOC\o1-3\h\z\u一、实验题目 3
二、实验目的 3
三、实验要求 4
四、实验报告 4
总体设计思想 4
详细算法设计 4
流程框图 5
函数相关说明 6
输入与输出 10
程序运行结果 11
词法分析器使用说明 12
心得与体会 12
源程序清单 12
一、实验题目
对下述单词表定义的语言设计编制一个词法分析器。
各种单词符号对应的种别码如下表:
单词符号
种别编码
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
二、实验目的
设计、编制并调试一个词法分析程序,如加深对词法分析原理的理解。
三、实验要求
处理用户提交的符合上述词法的源代码序列,进行词法分析,并输出单词二元组。
四、实验报告
总体设计思想
从字符串表示的源程序中识别出具有独立意义的单词符号,其根本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
详细算法设计
设置3个初值变量和一个关键字表:
chartoken[8]用来存放构成单词符号的字符串;
doublesum用来存放无符号整数或者浮点数;
intsyn用来存放单词符号的种别码;
关键字表:char*rwtab[6]={“begin”,”if”,”then”,”while”,”do”,”end”};
设置重要的全局变量:
charch用来存放当前镀金的源程序字符;
charprog[80]用来存放所有用户输入的字符;
intisDecimal是否为浮点数,值为1表示为浮点数,否那么不是浮点数
doubledecimal双精度,浮点数的小数局部
intisE是否为指数形式表示的浮点数,值为1:表示是指数形式表示的浮点数
intindex指数形式的幂
intisNeg是否为负数幂,值为1:表示为负数幂
设置关键的函数:
voidscanner()词法扫描程序
getchar()从控制台读取一个字符数据
intstrcmp(char*str1,char*str2),字符串的比拟
doublepow(doublex,doubley)计算x的y次幂
流程:
记录下输入的源程序字符串
调用scanner()函数对字符串进行各种关键字、运算符和界符、数字的扫描匹配,并且给出相应的种别码,输出单词二元组
流程框图
图C.1词法分析主程序示意图
图C.2词法分析程序流程
函数相关说明
getchar()该函数用来接收用户输入:
借助do……while()循环来记录用户输入的源程序字符串
do{
ch=getchar();//将用户输入的字符读入到ch变量中
prog[p++]=ch;//将字符存于数组中
}while(ch!=‘#’);//当用户输入’#’号时,结束输入。
scanner()该函数用来扫描源程序字符串并进行区别分类
如果是字母字符,那么进行关键字的匹配:
if(((ch=a)(ch=z))||((ch=A)(ch=Z)))//ch是字母字符
{
while(((ch=a)(ch=z))||((ch=A)(ch=Z))||((ch=0)(ch=9)))
{
token[m++]=ch;//ch=token以便进行关键字的匹配
ch=prog[p++];//读下一个字符
}
token[m++]=\0;
p--;//回退一格
syn=10;//标识符
//判断是否是begin,if,then,while,do,end标识符中的一个
for(n=0;n6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
对数字进行判断,并且进行数值的计算:
else if((ch=0)(ch=9))//对数字进行识别
{
IsNum://在此处设置一个goto的标识符以便实现“数字识别代码段”的复用
if(isSignal==1)
{
//token[m++]=-;
}
while((
文档评论(0)