词法分析器 1

1.1简介

        词法分析器是唯一一趟会操作输入程序中每个字符的处理过程。它的任务相对简单,聚合字符以形成源语言中的单词和标点。

        为完成这种聚集和分类操作,词法分析器会应用一组描述输入程序设计语言的词法结构(也称 微语法)的规则;微语法规定了如何将字符组合为单词,以及反过来如何分开混合在一起的各个单词。

1.2识别单词

        例举最简单的一种方式:逐字符处理 new

        该代码片段对每一个字符执行了一次测试,图中右侧给出了简单的转移图来表示该片段。这个转移图表示了一个识别器,每个圆圈代表一个状态。接受状态以双层圆圈绘制,在识别器的转移图中,通常会省去目标为错误状态的转移。

        识别多个单词,从同一个给定状态发出多条边。例举:识别 newnot 的识别器

        通过合并初始状态并重新标记所有状态,可以合并用于识别 new/not 的识别器和用于 while 的识别器。

1.21识别器的形式化

        转移图可以看作是形式化的数学对象,称为有限自动机(FA,Finite Automata,它定义了识别器的规格。

有限自动机是一个五元组(S,\sum\wp,S0,SA),各分量含义如下:

识别 new/not/while 的FA形式如下:

        对于状态si和输入字符c的所有其他组合,定义\wp(si,c)=se,se是指定的错误状态。这种五元组与转移图是等价的,给出一种表示,可以建立另一种表示。

        FA在处理字符串时的情况:

                1)状态连通输入字符转入下一个状态;以此类推,直至耗尽所有的输入,最后一次应用\wp的结果仍然是一个状态。如果是个接受状态,那么FA就接受了该字符串。

                2)某个字符x可能使FA转移到错误状态se。这种情况表明发生了词法错误,在FA接受的语言中,该字符串不是任何单词的有效前缀。

                3)如果FA耗尽输入后,终止于se之外的某个非接受状态,此时FA同样会发现输入的一个错误。

1.12识别更复杂的单词

        以无符号整数为例:一般来说,一个整数或者为0,或者由一个或多个数位组成,其中第一位可以是1到9的任意数字,后续数位可以是0到9的任意数字。

        但这个转换图有几个问题:第一,无法终结,这违反了有限集S的规定;第二,从s2开始,这条路径上所有状态都是等价的,即它们的输出转移边上有同样的标签且均为接受状态。

        如果我们允许转移图有环,即可显著简化FA。

        就FA而言,这种有环的转移图是有意义的,但从实现角度,它比无环更为复杂。它无法直接转换成一组嵌套的 if-then-else 结构。环的引入,产生了对循环控制的需求,可以用 while 来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值