规则引擎:语义分析 | 青训营笔记

149 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第16天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记

构建规则引擎的重要一步就是对输入进行语义分析,今天分享语法制导的语义分析方法。

语法制导的语义分析

语法规则对应着一些语义规则

产生式对应其左右侧的非终结符(语法节点)的属性的推导方法:

  1. 有些时候可能只需要一点点信息就能推导
  2. 根据所需要信息的相对位置(依赖关系),我们可以将这些语义属性进行分类

synthesized attribute

如果属性的任何依赖来自其孩子节点,那么是综合属性

S 属性文法

如果一个属性文法其属性全是综合属性,那么就是S属性文法。

这样的文法非常容易设计语义分析程序

  1. 自底向上
  2. 后序遍历语法树节点

Inherited attribute 继承属性

不是综合属性的属性就是继承属性。

如果全是继承属性,那么采用先序遍历会比较方便

常见继承方式

  1. 从父节点获得
  2. 从同级别的siblings获得

语义分析信息传递如何实现

  1. 采用特殊数据结构存储属性的值
  2. 根据次序,我们采用返回值和参数来传递信息
  3. 将语义信息存在语法树上

一边做语法分析一边做语义分析

这样当然很快,不过我们可能需要对文法所带的属性做约束。

我们需要根据我们采用的解析法的能力(适用性)以及其特点——来确定我们如何在分析过程中附上语义分析。

比如很多语法分析采用左到右的顺序,我们填充属性也需要按这个顺序

  1. (综合属性不存在这种问题)
  2. 对于继承属性,要求不存在依赖是从右到左的。

如果满足这些要求,这就是一个 LAttributedL—Attributed Grammar

只存在从左到右的依赖,这样我们保证需要推导属性时,所需的信息已经扫描过了。

特别的,S属性文法也是L属性文法