这是我参与「第五届青训营」伴学笔记创作活动的第16天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记
构建规则引擎的重要一步就是对输入进行语义分析,今天分享语法制导的语义分析方法。
语法制导的语义分析
语法规则对应着一些语义规则
产生式对应其左右侧的非终结符(语法节点)的属性的推导方法:
- 有些时候可能只需要一点点信息就能推导
- 根据所需要信息的相对位置(依赖关系),我们可以将这些语义属性进行分类
synthesized attribute
如果属性的任何依赖来自其孩子节点,那么是综合属性
S 属性文法
如果一个属性文法其属性全是综合属性,那么就是S属性文法。
这样的文法非常容易设计语义分析程序
- 自底向上
- 后序遍历语法树节点
Inherited attribute 继承属性
不是综合属性的属性就是继承属性。
如果全是继承属性,那么采用先序遍历会比较方便
常见继承方式
- 从父节点获得
- 从同级别的siblings获得
语义分析信息传递如何实现
- 采用特殊数据结构存储属性的值
- 根据次序,我们采用返回值和参数来传递信息
- 将语义信息存在语法树上
一边做语法分析一边做语义分析
这样当然很快,不过我们可能需要对文法所带的属性做约束。
我们需要根据我们采用的解析法的能力(适用性)以及其特点——来确定我们如何在分析过程中附上语义分析。
比如很多语法分析采用左到右的顺序,我们填充属性也需要按这个顺序
- (综合属性不存在这种问题)
- 对于继承属性,要求不存在依赖是从右到左的。
如果满足这些要求,这就是一个 Grammar
只存在从左到右的依赖,这样我们保证需要推导属性时,所需的信息已经扫描过了。
特别的,S属性文法也是L属性文法