c语言lr分析器的设计与实现_词法分析 | 词法分析器的手工构造

在词法分析器中使用怎么样的算法和数据结构是我们的主要研究内容。

词法分析器的实现方法

  • 手工编码实现法
    • 相对复杂,且容易出错
    • 当能够对各个部分进行相当好的控制,效率高
      • 是目前非常流行的实现方法
        • GCC, LLVM,...
  • 词法分析器的生成器
    • 可快速原型、代码量少
    • 但较难控制细节

如下是手工编码分析常用的转移图:

605c13818d98d42cd96f2cfa242631f1.png

其中双圆圈表示接收/识别状态,一个单词的识别已经结束。

下面给出一个转移图算法的例子:

token 

f664d9371cbab0637b136e31a4599dee.png
token 

识别关键字

(以 if 为例),有如下两种方法:

7d2d08405b52b06497ca6180db84b8a4.png

对于 标识符关键字 其实是有很大的交集的:

  • 从语法分析的角度看,关键字是标识符的一部分
  • 以C语言为例:
  • 标识符:以字母或下划线开头,后面跟零个或者多个字母、下划线、或数字。
  • 关键字:if, while, else, ....

关键字表算法

  • 对给定语言中所有的关键字,构架关键字构成的哈希表H
  • 对所有的标识符和关键字,先统一按标识符的转移图进行识别
  • 识别完成后,进一步查表H看是否是关键字
  • 通过合理的构造哈希表H(完美哈希),可以O(1)时间完成

原文链接:

  • 编译原理 - 网易云课堂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值