词法分析工作总结范文.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
精品合同推荐 精品合同推荐 词法分析工作总结范文 ★工作总结频道为大家整理的词法分析工作总结范文, 供大家阅 读参考。更多阅读请查看本站工作总结频道。 词法分析是编译器工作的第一阶段, 它的工作就是从输入(源代 码)中取得token,以作为parser (语法分析)的输入,一般在 词法分析阶段都会把一些无用的空白字符( white space ,即空 格、tab和换行)以及注释剔除,以降低下一步分析的复杂度, 词法分析器一般会提供一个 gettoken()这样的方法,parser可 以在做语法分析时调用词法分析器的这个方法来得到下一个 token ,所以词法分析器并不是一次性遍历所有源代码,而是采 取这种on-demand的方式:只在parser需要时才工作,并且每 次只取一个token。 token 和 lexeme 首先,token 不等于 lexeme。token 和lexeme 的关系就类似于 面向对象语言中“类”和“实例”(或“对象”)之间的关系, 这个用中文不知该如何解释才好,比如语言中的变量 a和b,它 们者漏于同一种 token : identifier ,而 a 的 lexeme 是” a”, b则是” b”,而每个关键字都是一种 token。token可以附带有 一个值属性,例如变量 a,当调用词法分析器的gettoken()时, 会返回一个identifier 类型的token,这个token带有一个属 性“a”,属性可以是多样的,例如表示数字的 token可以带有 一个表示数字值的属性,它是整型的。 如下代码: int age = 23; int count = 50; 可以依次提取出8个token : int(值为” int ”),id(值 为” age” ), assign(值为” =” ),number(值为整型数值 23), int(值为” int ” ), id(值为” count ” ), assign(值为”=”), number(值为 50) 正则表达式 正则表达式可以用来描述字符串模式,例如我们可以用 digit+ 来表示number的token,其中digit 表示单个数字(这里说正 则表达式并不完全和实现的正则引擎所识别的正则表达式等价, 这里只是为了描述问题而已)。 然而像c语言的的多行注释,用正则表达式来描述就比较麻烦, 此时更倾向于直接用有穷自动机(finite automaton )来描述, 因为用它来描述非常直观且很容易。 有穷自动机 (finite automata) 有穷自动机也称为有限状态机, 状态在输入字符的作用下发生迁 移,因此,它可以用来识别token ,也因此,我们只要画得出fa , 之后再用代码实现这个fa ,那词法分析器也就差不多弄好了。 有穷自动机分确定性(dfa )和非确定性(nfa )两种,如果对于 同一个输入,只会有一个确定的状态迁移路线, 也就是只有一个 确定的“下一状态”,那就是 dfa ,否则就是nfa。 因为dfa对于同一个输入只有一个确定的下一状态, 所以词法分 析器当然优先采用它,那 nfa拿来干嘛用呢? nfa用来做描述用 时更方便,我们可以非常迅速地画出一个识另U token的nfa图, 但要想直接画出个dfa那要动不少脑筋。 根据正则表达式构建nfa 如上所述,nfa更容易画出,那我们就先研究nfa ,在定义token 时,我们可以用正则表达式来描述它, 因为正则表达式干这行很 合适,例如一个 digit+就可以描述数字,多方便。因此,我们 需要根据正则表达式画出与之等价的 nfa。而这个算法非常简单, 就是tompson' s construction ,这个书上写得很清楚了。 将nfa转化成dfa (nfa的确定化) 对于计算机来说,面对同一个输入,如果有多个下一状态,那计 算机就不清楚要转到哪个状态, 所以我们期望能从正则表达式得 到dfa ,而不是nfa,因为这样将来编程实现时比较自然(同一 输入有确定的一个下一状态),而幸运的是,每个 nfa都可以转 化成dfa。为什么nfa可以转化成dfa ?因为fa(finite automata) 中的状态都是我们自己画的,只要 fa能正确的识别token,那 就ok 了,也就是,如果nfa和dfa都可以达到一样的效果:识 别token,那其它的我们就不管了。而 nfa确定化的本质,就是 将原来多个状态改用一个状态来表示,新状态其实是一个状态 集,比如nfa中状态si在输入a下可以到达s2和s3,那么, 在dfa中,就把s2和s3合起来认为是一个状态。 还有一个问题 是nfa中的空转换(?输入),如果si在?输入下可以到达s2, 就表7K si可以无

文档评论(0)

yj1028 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档