总结:编译原理--第三章 词法分析

第三章  词法分析

本章主要讨论了如何构建一个词法分析器。如果要手动地实现词法分析器,首先建立起每个词法单元的词法结构图或其他描述会有所帮助。然后,我们可以编写代码来识别输入中出现的每个词素,并返回识别到的词法单元的有关信息。

  • 词法单元。词法分析器扫描源程序并输出一个由词法单元组成的序列。这些词法单元通常会逐个传送给语法分析器。有些词法单元只包含一个词法单元名,而其他词法单元还有一个关联的词法值,它给出了在输入中找到的这个词法单元的某个实例的有关信息。
  • 词素。每次词法分析器向语法分析器返回一个词法单元时,该词法单元都有一个关联的词素,即该词法单元所代表的输入字符串。
  • 缓冲技术。为了判断下一个词素在何处结束,常常需要预先扫描输入字符。因此,词法分析器往往需要对输入字符进行缓冲。可以使用两个技术来加速输入扫描过程:循环使用一对缓冲区,以及在每个缓冲区末尾放置特殊的哨兵标记字符。该字符可以通知词法分析器已经到达了缓冲区末尾。
  • 模式。每个词法单元都有一个模式,它描述了什么样的字符序列可以组成对应于此词法单元的词素。那些和一个给定模式匹配的字的集合称为该模式的语言。
  • 正则表达式。这些表达式常用于描述模式。正则表达式是从单个字符开始,通过并、连接、Kleene 闭包、“重复多次”等运算符构造得到的。
  • 正则定义。多个语言的复杂集合,比如用以描述一个程序设计语言所有词法单元的多个模式常常是通过正则定义来描述的。一个正则定义是一个语句序列,其中的每一个语句定义了一个表示某正则表达式的变量。定义一个变量的正则表达式时可以使用已经定义过的变量。
  • 扩展的正则表达式表示法。为了使正则表达式更易于表达模式,一些附加的运算符可以作为缩写在正则表达式中使用。比如 + 、? 以及字符类。
  • 状态转换图。一个词法分析器的行为经常可以用一个状态转换图来描述。它有多个状态。在搜寻可能与某个模式匹配的词素的过程中,各个状态代表了已读入字符的历史信息。它同时具有多条从一个状态到达另一个状态的转换。每个转换都指明了下一个可能的输入字符,该字符将使词法分析器改变当前状态。
  • 有穷自动机。它是状态转换图的形式化表示。它指明了一个开始状态、一个或多个接受状态,以及状态集、输入字符集和状态间转换集合。接受状态表明已经发现了和某个词法单元对应的词素。与状态转换图不同,有穷自动机即可以在输入字符上执行转换,也可以在空输入上执行转换。
  • 确定有穷自动机。一个确定有穷自动机是一种特殊的有穷自动机。它的任何一个状态对于任意一个输入符号有且只有一个转换。同时它不允许在空输入上的转换。确定有穷自动机类似于状态转换图,对它的模拟相对容易,因此适于作为词法分析器的实现基础。
  • 不确定有穷自动机。不是确定的有穷自动机称为不确定的。 NFA 通常要比确定有穷自动机更容易设计。词法分析器的另一种体系结构如下:对应于各个可能模式都有一个 NFA,并且我们使用表格来纪录这些 NFA 在扫描输入字符时可能进入的所有状态。
  • 模式表示方法之间的转换。我们可以把任意一个正则表达式转换为一个大小基本相同的 NFA,这个 NFA 识别的语言和该正则表达式识别的相同。更进一步,任何 NFA 都可以转换为一个代表相同模式的 DFA,虽然在最坏的情况下自动机的大小会以指数级增长,但是在常见的程序设计语言中尚未碰到这些情况。可以将任意一个确定或不确定有穷自动机转化为一个正则表达式,使得该表达式定义的语言和这个自动机识别的语言相同。
  • Lex。有一系列的软件系统,包括 Lex 和 Flex,可以作为生成词法分析器的工具。用户通过扩展的正则表达式来描述各种词法单元的模式。Lex 将这些表达式转换为词法分析器。这个分析器实质上是一个可以识别所有模式的确定有穷自动机。
  • 有穷自动机的最小化。对于每一个 DFA,都存在一个接受同样语言的最少状态 DFA 。不仅如此,一个给定语言的最少状态 DFA 是唯一的。

希望我的总结可以帮助大家,感谢阅读我的博客!

猜你喜欢

转载自blog.csdn.net/weixin_42558631/article/details/81218427