- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理二
词法分析器
问题描述
词法分析程序的功能:
输入源程序,输出单词符号,如图所示:
源程序 词法分析器 ?单词符号
处理过程:在扫描源程序字符串时,一旦识别出关键字、分隔符、标识符、无符 号常数中之一,即以单词形式(各类单词均采用相同的结构,即二元式编码形式) 输出。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直 至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。
需求分析
对给定的程序通过词法分析器能够识别一个个单词符号, 并以二元式(单词类 型,单词符号)显示;
可以将要分析的程序保存到文件中进行读取;
删除无用的空白字符、回车符、及其它非实质性符号。
程序设计
本程序规定:
⑴关键字begin,end,if,then,else,while,write,read.
do, call,co nst,char, un til,procedure,repeat
(2)运算符:+ * /=⑶界符:{,}
(2)运算符:
+ * /=
⑶界符:{,}
II
[];
(4)其他标记 如字符串,表示以字母开头的标识符 ⑸ 空格、回车、换行符跳过 对于一段可能的输入代码,其结果在屏幕上显示如下:
(1 , 无符号整数)
(begin , 关键字)
(if , 关键字)
(+,运算符)
(;,界符)
(a ,普通标识符)
关键字或标识符的判断:读入一串字符,将ASCII码在字母范围的字符存入数组中,将该数组与设置好的关键字比较,如果相等则输出是关键字,否则继续读入 直至下一字符既非数字也非字母,输出为标识符;
数字的判断:若跟在字母后面则一起输出为标识符,否则输出为数字;
界符、运算符的判断:直接判断其 ASCII码
运行过程为:
1.预处理:把源文件一个字符一个字符的读入词法分析程序设置的输入字符 结构体数组中(输入缓冲区),读入过程要删除多余的空格;
2 ?源程序字符数组中获得单词,编码为二元式.:二元式采用结构体数组存 储,把单词类型和词元记录下来。
为了方便和适用起见,首先建立一个文本,进而在文本中进行pascal语言输入。 输入完毕之后,就可以进行从文本中取字符,进而把它放在一个数组中。之后再 数组中进行取字符,之前要定义一个数组,定义一个指针指向数组,为 first 。 之后就用一个循环依次从数组中取字符,假如是字符就放在 buf中,first++ ;
一次进行下去,期间要时刻与关键字指针数组进行比较如果相等就立马输出, 并
显示是关键字此时将buf置为初值,first重新指向首地址。
流程图
YNY是界符是N是数字N是;_? 输出”界符输出”常数读取字符ERROR
Y
N
Y
是界符
是
N
是数字
N
是
;_? 输出”界符
输出”常数
读取字符
ERROR
读取字符
Y
输出”运算符
ERROR
调试分析
刚开始的时候,我的程序没有采用文件形式,结果只能输入一行代码分析一行, 很不实用,后来我想到可以将分析结果保存到数组中, 并将结果和结果之间用 空格分隔开,这样在输出时就可以连续输出了, 我将这一思想运用到了文件系 统中,经过改进,现在的程序可以分析保存在文件中的比较长的代码了。
用户手册
现将要处理的代码段保存于文件中,在本程序中,我保存的位置是D:\
hello.txt ,文件内容如下图所示:
点击运行程序需要先输入待分析代码的文件位置,在本程序中是 D:\
hello.txt ,输入后程序自动分析并输出结果。
运行结果
点击运行程序,其分析结果如下:
L? R-Col IV
J L
?M.-h Jira- b昭屯
切如W M ?i
p di
弋-—L ■ eE ? ■荀
些an |
**gg L
I ??■ i ?□?屮“〕卜 f i?dini4K|^ ■.
弓弓、if i rtll*
n. ■爭 nHn1Hfl n @出已
n. ■
爭 nHn
1H
fl n @
出已IR
:J-Fn洛 *1E甬骨肇 5*:r-+AeHH:
It#
程序代码:
#i nclude iostream
#in cludestri ng
using n amespace std;
#defi ne MAX 22
char ch =;
stri ng key[15]={begi n,e nd,if,the n ,else,while,write,read,
do, call,co nst,char, un til,procedure,repeat};
int Iskey(stri ng c){ // 关键字判断
int i;
for(i=0;iMAX;i++) {
if(key[i].compare(c)==0) return 1;
}
return 0;
}
int lsLette
文档评论(0)