📜  编译器设计语法指示的定义

📅  最后修改于: 2021-07-02 18:22:21             🧑  作者: Mango

先决条件–语法分析简介,语法直接翻译
语法定向定义(Syntax Directed Definition,SDD)是一种抽象规范。它是上下文无关文法的一般化,其中每个文法产生式X –> a与之相关联,形式为s = f(b 1 ,b 2 ,…b k )的一组产生式规则,其中s是从中获得的属性函数f。该属性可以是字符串,数字,类型或存储位置。语义规则是通常在生产结束时嵌入并括在花括号({})中的代码片段。

例子:

E --> E1 + T  { E.val = E1.val + T.val} 

带注释的分析树–包含给定输入字符串的每个节点处的属性值的分析树称为带注释的或修饰的分析树。

特征 –

  • 高规格
  • 隐藏实施细节
  • 未指定明确的评估顺序

属性类型–有两种类型的属性:

1.综合属性–这些属性是从其子节点派生其值的,即,节点的综合属性值是根据解析树中子节点的属性值来计算的。

例子:

E --> E1 + T  { E.val = E1.val + T.val} 

在这种情况下,E.val从E 1 .val和T.val得出其值

综合属性的计算–

  • 在给定的语法中,使用适合每个语义的语义规则编写SDD。
  • 生成带注释的分析树,并以自下而上的方式计算属性值。
  • 在根节点处获得的值是最终输出。

示例:考虑以下语法

S --> E
E --> E1 + T
E --> T
T --> T1 * F
T --> F
F --> digit

上面的语法的SDD可以写成如下

让我们假设一个输入字符串4 * 5 + 6用于计算合成属性。输入字符串的带注释的分析树是

为了计算属性,我们从最左边的底部节点开始。规则F –>数字用于将数字还原为F,并且数字的值从词法分析器获取,该词分析器变为F的值,即从语义动作F.val = digit.lexval。因此,F.val = 4,并且由于T是F的父节点,所以我们从语义动作T.val = F.val得到T.val = 4。然后,对于T –> T 1 * F产生,相应的语义作用是T.val = T 1 .val * F.val。因此,T.val = 4 * 5 = 20

类似地,E 1 .val + T.val的组合变为E.val,即E.val = E 1 .val + T.val =26。然后,使用乘积S –> E来降低E.val = 26和与之关联的语义动作将打印结果E.val。因此,输出将为26。

2.继承的属性–这些属性是从其父节点或同级节点派生其值的属性,即,继承属性的值由父节点或同级节点的值计算得出。
例子:

A --> BCD   { C.in = A.in, C.type = B.type } 

继承属性的计算–

  • 使用语义动作构造SDD。
  • 生成带注释的分析树,并以自上而下的方式计算属性值。

示例:考虑以下语法

S --> T L
T --> int
T --> float
T --> double
L --> L1, id
L --> id

上面的语法的SDD可以写成如下

让我们假设一个输入字符串int a,c用于计算继承的属性。输入字符串的带注释的分析树是

L节点的值是从T.type(同级)获得的,它基本上是作为int,float或double的词汇值。然后,L节点给出标识符a和c的类型。类型的计算以自上而下的方式或顺序遍历来完成。使用Enter_type函数,将标识符a和c的类型插入符号表中相应的id.entry处。