Home 语法制导的定义
语法制导的定义
取消

语法制导的定义

 

一、基础文法

    1、语法制导的定义:带属性和规则的上下文无关文法

    2、基础文法:语法制导定义中的文法(LL或者LR之类的)

    3、定义:

        每个文法符号都有一组属性

        每个文法都有一组语义规则

        综合属性:由分析树中它的子节点的属性计算得到

        继承属性:由分析树种它的父节点和兄弟节点计算得到

    4、常识

        终结符只有综合属性

        文法的开始符号只有综合属性

        文法的综合属性和继承属性的交集为空

        形如:综合属性    产生式    继承属性 的类型中

                属性的计算规则只能由产生式的文法符号提供

        形如:继承属性    产生式    综合属性 的类型中

                属性的计算规则不由产生式提供的规则计算

二、语义规则

    1、功能

        属性计算    静态语义检查    符号表操作    代码生成

    2、虚拟综合属性

        产生式左部非终结符的虚拟综合属性

        会产生副作用的操作(如print(E.val))

    3、属性文法

        是指语义规则中无副作用的语法制导定义

区别是否产生副作用

三、概念

1、S属性定义:仅仅使用综合属性的语法制导定义

2、注释分析树:每个节点的属性值都标注出来的分析树

3、继承属性:节点的属性由此节点的父节点和兄弟节点计算,

                        用于表示上下文依赖关系(如定义)

4、依赖图:(有向图)

        a、为每一个包含过程调用的语义规则引入一个虚拟综合属性

        b、为每一个属性设置一个节点,如果b依赖于c,则有c—>b(依赖什么给你什么)

        c、通过拓扑排序找到属性计算次序

 

5、循环依赖:如A.s = B.i

                          B.i = A.s

    如果一个属性文法中不存在循环依赖,则称为良定义

 

四、属性计算次序

    根据输入串构建分析树

    构造依赖图

    拓扑排序

    按拓扑排序计算属性

五、语义规则的计算方法

(1)分析树方法   

        一旦有环即为失败

        编译速度慢

(2)基于规则的方法:静态确定语义规则的计算次序

        首先使用工具或手工计算出每个产生式的语义规则的计算次序,编译时按顺序就行了

        缺点是复杂的依赖关系很难确定次序

        特点:语法分析和属性计算分开,先构造分析树,然后按照事先定义的策略计算

        因为要考虑语义规则的定义和计算顺序,因此是基于规则的方法        

(3)忽略规则的方法:事先确定属性的计算策略(如边分析边计算),

                            则语义规则的设计必须符合所选分析方法的限制。

        如Yacc,是有确定的计算策略的,因此将按照策略来写语义规则

        优点是不够造依赖图,提高效率,缺点是限制了语法制导定义的种类

 

 

 

 

 

 

    

该博客文章由作者通过 CC BY 4.0进行授权。