【词法分析实验小结】词法分析小结

工作总结范文 2023-11-06 网络整理 晴天

【fanwen.jxxyjl.com--工作总结范文】

  词法分析是编译器工作的第一阶段,它的工作就是从输入(源代码)中取得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用来做描述用时更方便,我们可以非常迅速地画出一个识别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,那其它的我们就不管了。123

  而nfa确定化的本质,就是将原来多个状态改用一个状态来表示,新状态其实是一个状态集,比如nfa中状态s1在输入a下可以到达s2和s3,那么,在dfa中,就把s2和s3合起来认为是一个状态。还有一个问题是nfa中的空转换(?输入),如果s1在?输入下可以到达s2,就表示s1可以无条件地转移到s2,那s1和s2自然可以合并起来作为dfa中的一个状态,于是nfa转dfa的算法也就好理解了。但首先得先定义下空闭包(?-closure):

  ?-closure: 状态s的?-closure即s经过?转换可以到达的状态集,s的?-closure永远都会包含s自身。一个状态集的?-closure即该状态集中各状态的?-closure的集合。

  nfa确定化算法(subset construction):

  从开始状态开始,计算它的?-closure,得到状态集set1,然后考察set1在某个输入a的作用下会迁移到哪些状态,把这些状态集中到一起,再求这个集合的?-closure,得到set2,这样我们就可以画两个圈,一个标上set1,另一个标上set2,然后画条从set1到set2的线把这两圆连起来,在线上标上a,这样dfa的一部分就画好了,然后我们再考察set1在其它输入下可以达到的状态集的?-closure,同样画圈连线,以此类推,最后的时候,把包含了原nfa中终结状态(final state或acceptin state)的dfa状态(在转换后的dfa中,每个状态都是包含了一个或多个原nfa中的状态)标记为终结状态。

  最小化dfa状态数

  由一个正则表达式,可以构建出一个等价的nfa,然后nfa又可以确定化成dfa,似乎到此事情搞完了,但事实证明(有时也可以显然地发现),最终构成的这dfa似乎有些复杂,有些状态好像很冗余,呃,是的,dfa是可以最小化的。

  最小化dfa状态数算法的思想是,在开始时,假设是最完美的情况,整个dfa只有两个状态,一个终结状态,一个开始(难道不能有只有一种状态的情况么?如果原dfa中存在非终结状态,当然就不能,非终结态怎么可以和终结态合并!),当然,这是假设,不是真的,所以这个算法,就是在这个完美的假设下,对假设进一步考察,如果发现有些状态不能合并,那就分出来吧,这样重复考察,直到发现没有状态会不能合并时,就做完了,此时不也正是最优解么。

  嗯,就是这个,所以一开始,我们把所有非终结状态用一个袋子包起来,看成是一个状态,把所有终结状态也用另一袋子包起来,也看成是一个状态,注意,别把原dfa中各状态间的连线给扯断了。然后,我们抽出其中一个袋子,考察其中的各个状态,我们准备好所有的可能输入,然后逐个拿出来测试,如果该袋子中的所有状态在某个输入a下达到的状态正好都在这个袋子中,那就说明,这个袋子中的这些状态“在目前看来”是可以合并的,也就是说,如果在所有的可能输入的作用下,袋子中的状态达到的新状态正好也都是这个袋子中的状态,那它们就可以合并。而如果,在某个输入a下,袋子中的一部分状态会转移到同一袋子中的其它状态,而有几个叛徒,假设是s1和s2,竟然在输入a下会迁移到其它袋子中的状态,那就说明s1和s2是不可以和其它转移到同一袋子中的状态合并的,于是,我们就把s1和s2装成一个新袋子,从原袋子中分出来,当然,现在还是假设s1和s2可以合并,所以才把它们装一起,究竟真的可不可以合并呆会还要再考察。考察完输入a,还要接着考察其它的可能输入。如果在考察完一个袋子后,发现所有状态在a输入下都可以转移到本袋子中的状态,那么最后的dfa它们就被合并成一个状态,并且在a输入下,它有一个到自身的状态迁移。123

  实现词法分析器

  对于一个token,比如用来表示数字的token:num,我们可以用正则表达式描述它,然后画出nfa,再将nfa转化成dfa,再最小化dfa的状态,但是我们的词法分析器是不是分析一个token,所以我们要把所有类型的token的dfa合并成一个dfa,这样,这个dfa也就可以识别语言的所有token了,如果在某一连串的输入下,dfa达不到终结状态,那就说明源代码有错误了。

  我用c#实现了一个用于《compiler construction: principles and practice》中tiny语言的词法分析器,tiny语言有关键字:if, then, else, end, repeat, until, read, write,有操作符+,-,*,/,=,<,(,),;,:=(全角逗号不算,是文章的分隔符)这10个,然后其余的token有number (一或多个数字)和identifier(一或多个字母),其dfa如下图:

  上面这张图和《编译原理及实践》中的一样,其中的带中括号的输入说明这个输入是lookahead的,在匹配成功后是要重新放回输入流中的,比如识别num时,如果发现个非digit的,那就说明识别到了一个number,但是最后识别的那个非digit字符是要放回输入流的,因为它要留着下一次识别。

  其中从start到done的那个other,指所有非white space,非{,非letter,非digit,也非:的字符,它有可能是合法的+, *, /这些,也可能是不合法的其它输入,如#号。因此,done这个状态只是说本次gettoken已经结束,状态机是有可能因为不合法的输入而进入done状态的。究竟从start到done是因为合法的,如+号导致的,还是由不合法的如#号导致的,将在代码中实现判断,但可以肯定的是,不管是+号还是#号作用于start状态,都会进入done状态。

123

本文来源:https://fanwen.jxxyjl.com/gongzuozongjiefanwen/214048.html

  • 二年级上册数学培优辅差总结|二年级数学培优辅差工作总结

    篇一:  这一学期,本班现有的学生相互之间学习及纪律情况参差不齐,会自然而然地产生一系列的问题,需要提高优生的自主和自觉学习的能力,使其影响并提高中等生的学习成绩,帮助差生取得适当进步,让差生在教师的辅导和优生的帮助下,逐步提高学习成绩,并培养较好的学习生活习惯,并逐步提高纪律意识和思想道德水平...

    发布于:2024-03-12

    详细阅读
  • 【2021年工作总结和明年计划】村2021年工作总结及明年工作打算

    篇一  20xx年在街道党工委办事处的指导下,严格按照年初既定的经济和社会发展规划,在街道各部门的支持下,认真完成年初制定的工作任务,具体工作情况总结如下:   一、经济发展情况   1、实现村集体收入60万元;   2、争取上级补助资金89万元;   3、实现农民人均收...

    发布于:2024-03-12

    详细阅读
  • 档案馆馆藏档案清点工作总结_大学档案馆的优质工作总结

    篇一  一年来,档案馆在学校领导的正确领导下,在新班子的带领下围绕学校中心工作开拓创新、奋力拼搏,管理出了新思路,业务上了新台阶,研究上了新水平,工作出了新成果。在今年的湖南省档案局评优活动中,我校档案馆被评为省直单位档案工作先进集体。  1、力求管理创新,实现档案的价值。  努力探寻管理理念创...

    发布于:2024-03-12

    详细阅读
  • 【招聘专员的年终总结】招聘专员年终总结三篇

    【篇一】  时光飞逝,在紧张、忙碌而又充实的工作中,在公司领导和同事们的帮助下。工作中有进步也有需要提升地方。下面就我20xx年来的工作做一下总结:  一、展馆相关事务  1 前期协助企划经理处理展馆开馆的相关事务,制作培训课件,对讲解员进行相关培训。包括:  礼仪培训,相关展品的背景介绍,整个...

    发布于:2024-03-12

    详细阅读
  • 领导班子工作总结述职报告范文|校领导班子工作总结范文

    篇一:  XX年是我校更名为xx学院第xx属小学,归属学院党委领导的第一年,也是我校圆满完成第一个三年发展规划任务,谋划第二个三年发展规划的开启之年。一年来,我校全面贯彻党的教育方针,在学院党委的领导下,按照科学发展观的总体要求,紧紧围绕学校发展规划工作目标,以提高课堂教学质量和班级管理水平为重...

    发布于:2024-03-12

    详细阅读
  • 2021党支部书记工作总结范文|2021乡镇纪委工作总结范文

    篇一:  20XX年,镇纪委在县纪委、监察局和镇党委的正确领导下,认真学习贯彻党的xx大会议精神及中纪委xx届二次全会精神,按照省、市、县纪委要求,坚持标本兼治、综合治理、惩防并举、注重预防的方针,突出工作重点,积极履职尽责,有力推进了我镇党风廉政建设和反腐败工作。现将全年工作简要汇报如下:...

    发布于:2024-03-12

    详细阅读
  • 【单位优秀司机个人工作总结】司机个人优秀工作总结

    篇一  一年来,在处领导及科室领导的关怀支持下,在其他同志的配合与帮助下,我立足本职,扎实工作,对照既定的工作计划和量化考核细则,积极主动,强化落实,顺利地完成了自己所承担的工作任务,在政治思想和本职工作方面取得了一定的进步。  一、加强政治学习,不断提高政治思想水平  积极参加单位组织的各项政...

    发布于:2024-03-12

    详细阅读
  • 【部队干部年终总结怎么写个人】部队干部年终总结怎么写

    【篇一】  20xx年的工作已经过去了,回顾这年来的工作,本人在连队首长的领导下,认真按照条令条例和规章制度去严格要求自己,认真落实上级的指示精神,一年来,不管在工作、生活、学习上,还是在训练管理上都取得较大的进步,下面我就一年来的工作、学习、生活、管理等情况工作计划如下:  一、政治思想方面...

    发布于:2024-03-12

    详细阅读
  • 【老年大学班级工作总结范文】老年大学的工作总结范文

    篇一  **市老年大学坚持“学乐康为”的办学方针,以课堂教学为主阵地,以教学研究为突破口,以加强基层办学为重点,开拓思路、扎实工作,各项工作取得较大进展。20xx年,**市老年大学被评为“**市老年文体活动先进集体”,刘章国副局长被评为“全国老年教育先进个人”,杨静副校长被评为“**市老年文体活...

    发布于:2024-03-12

    详细阅读
  • 小学五年级留守儿童工作总结|小学留守儿童个人工作总结

    篇一:  我代表XX小学全体师生对各位领导的到来表示热烈的欢迎。下面我就我校关爱留守儿童工作向各位领导作以汇报。  我校位于碧岩镇政府所在地碧岩行政村。始建于民国36年,是一所全日制公办小学。学校占地面积9920平方米,建筑面积1140平方米。现有教师14名,学生351人,来自碧岩、珠帘、万沟、...

    发布于:2024-03-12

    详细阅读

Copyright @ 2011-2019 范文大全网 All Rights Reserved. 版权所有

免责声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。

 站长统计