编译原理实验二学习资料.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

136****3783 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档