- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
S语言词法分析程序
编译原理课程设计
——S语言词法分析
班别:计算机023班 姓名:范绍森 学号:17号
一、设计任务
本实验的任务是编写一个S语言的词法分析程序,它从左至右逐个字符地对S语言源程序进行扫描,产生一个个的单词符号的机内表示。
在此,将词法分析作为单独的一遍,如下图所示:
具体任务有:
组织源程序的输入。
拼出单词并转换成机内表示形式,形成token文件(单词序列)、符号表文件。
删除注释、空格和无用符号。
发现并定位词法错误。
列表打印错误信息。
二、设计要求
1、能对任何S语言源程序进行分析
为此,在运行词法分析程序时,应用问答方式输入要被扫描的S语言源程序的文件名,然后对该源程序完成词法分析任务。
2、能检查并处理某些词法错误
词法分析程序应给出处理以下三种词法错误(编号分别为1、2、3),其他错误可不必考虑(即认为不会出现):
(1)非法字符。处理方式是删去该字符(即不写入token文件)。
(2)不正确的单词,包括以下三种情况:
数字开头的数字、字母串,如3a56。
实数中出现二个小数点,如3.14.15。
实数的小数部分出现字母,如5.26B78。
以上三种情况处理方法是:截去后面出错部分,使其成为一个正确单词(即常数)。如:3a56转换成3,3.14.15转换成3.14,5.26B78转换成5.26。
(3)源程序文件已结束而注释未结束(即程序最后的注释没有结束符*/)。
三、程序数据结构
1、输入
S语言源程序,为文本文件。
2、输出
词法分析程序的运行结果是:产生一个单词序列文件(即token文件)和一个符号表文件,并输出错误信息。
(1)token文件结构
token文件用于存放从S语言源程序中扫描出来的一个个单词符号的机内表示,其文件结构如下:
typedef struct token
{int label;
char name[30];
int code;
int addr;
}token;
说明:
label:单词序号;
name[30]:单词本身;
code:单词的机内码。
addr:地址,单词为保留字时值为—1,为标识符或常数时为大于0的数值,即该标识符或常数在符号表中的入口地址。
(2)符号表文件结构
符号表用于存放S语言源程序中出现的标识符、实常数、整常数,其文件的结构如下:
typedef struct symble
{ int number;
int type;
char name[30];
}symble;
说明:
number:序号;
type:类型;
name[30]:名字。
四、程序参考结构及模块说明
这里给出一个程序结构的参考方案,设计思路如下:
1、Scanner()
功能:完成初始化,并循环调用子模块完成单词的识别。
算法描述:
Void Scanner()
{ 调用Scanner()进行初始化;
读取源程序的第一个字符;
while(字符!=EOF)
{if (字符= =字母) IsAlpha();
else if (字符= =数字) IsNumber();
else if (字符= =’/’) IsAnotation();
else if (字符= =’’’) IsChar();
else IsOther();
}
打印结束信息;
结束操作;
}
2、IsAlpha()
功能:识别保留字和标识符。
算法描述:
Void IsAlpha()
{1、while(字符为字母或数字或’_’号)
{ 记录当前字符;
读取下一个字符;
}
2、判断所记字符串是否为保留字并置标志符h
/*为保留字,则标志符h=1;否则为标识符h=0*/
3、调OutPut()输出保留字或标识符;
}
3、IsNumber()
功能:识别整数和实数。
算法描述:
Void IsNumber()
{int flag=0;
while(字符为数字)
{记录当前字符;
读取下一字符;
if(字符为’.’号)
{记录当前字符
flag=1;
读下一字符;
跳出循环;
}
}
记单词编码为整数的编码(当前token为整数);
if(flag)
{ if(当前字符为数字)
{ 记录当前字符;
whi
文档评论(0)