- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数学与信息工程学院
《编译原理》
实验报告一
实验名称:词法分析
实 验 室:
班 级:
姓 名:
学 号:
词法分析器的设计
实验目的
通过完成词法分析程序,了解词法分析的过程。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。
实验环境
操作系统:window xp
编写环境:visual c++ 、c-free、turbo c
编写语言:c语言
分析语言:PL/0
实验内容
对PL/0语言进行词法分析,把输入的字符串形式的源程序分割成一个个单词符号,其词法描述如下:
关键字:begin,call,const,do,end,if,odd,procedure,read,then,var,while,write
标识符:用来表示各种名字,必须以字母开头小于10位字符组成
数字:以0-9组成小于14位的数字
运算符:+,-,*,/,:=,<,<=,>,>=
界符:,,.,;,#
表1 各种单词符号对应类型表
单词符号
类型
+
plus
-
minus
*
times
/
slash
(
lparen
)
rparen
=
eql
,
comma
.
perio
#
neq
;
semicolon
begin
beginsym
call
callsym
const
constsym
do
dosym
end
endsym
if
ifsym
odd
oddsym
procedure
proceduresym
read
readsym
then
thensym
var
varsym
while
whilesym
write
writesym
N
N
N
Y
Y
开始
调用GETSYM取单词
输入要分析的文件
文件是否存在
文件是否结束
结束
打印分析结果
图1 主流程图
Y
Y
N
N
N
N
N
Y
Y
Y
Y
GETSYM
滤空CH=空?
GETCH
CH是字母?
K:=0
K<10?
K:=K+1
A[K]:=CH
GETCH
CH是字母或数字?
ID:=A
ID是否是保留字?
SYM:=IDENT
相应保留字类别送SYM
返回
CH是数字?
拼数,将拼数后的值送NUM
SYM:=SYM
把该字符转换成对应单词,或拼复合单词,将其类别送SYM中
图2 GETSYM流程图
N
Y
GETSYM函数功能:
滤空格 空格在词法分析时是一种不可缺少的界符,而在语法分析时则是无用的,所以必须过滤
识别保留字 主程序定义了一个以字符为元素的一维数组WORD,称保留字表。对字母开头的字母、数字字符串要查此表。若查着则识别为保留字,将对应的类别放在SYM中。如IF的对应值IFSYM,THEN的对应值为THENSYM。若查不着,则认为是用户定义的标识符
识别保留字 对用户定义的标识符将IDENT放在SYM中,标识符本身的值放在ID中
拼数 当扫描到数字串时,将字符串形式的十进制数转换为二进制数,然后把数的类别NUMBER放在SYM中,数值本身的值放在NUM中
拼合复合词 对两个字符组成的算符,如:>=、:=、<=等单词,识别后将类别送SYM中
输出源程序 为边读入字符边输出(可输出在文件中)
N
N
N
GETCH
缓冲区是否还有字符?
源程序文件是否结束?
打印出错信息
停止编译
读入一行源程序放入在LINE中并输出,置CC:=0
CC:=CC+1
CH:=LINE[CC]
返回
Y
Y
图3 GETCH流程图
实验结果
要分析的内容如下:
const a=35;
var c,d;
procedure p;
begin
var g;
g:=465494366466564444;
write(g);
end;
begin
read(c,d);
if c<=d then c:=a;
write(c,d);
call p;
end.
调试分析(实验中遇到的问题总结)
数组a[a1+1]的长度为11,而保存数字是数据过长导致溢出
解决方法:将a数组的数据大小改为50;
如果将程序最后的‘.’去掉,会导致死循环,原因为读入的下一个字符为空时无法退出循环,,导致死循环
解决方法:当读入字符为10时,如果下一个读入的字符为0,则单独判断下,具体见附录修改后的代码
实验小结(心得体会)
代码通过getsym()函数来读入一个词语进行分析,同时通过getch()函数来读入下一个字符,要注意的是回车也算是一个字符,程序是通过EOF来结束的,代码都是对ASCII码进行操作,回车为10,要注意数组能保存的大小,保证数组不越界,同时对数据进行判断,保证符合词法要求;附录:源代码
#include<stdio.h>
文档评论(0)