本文是记录专业课“程序语言理论与编译技术”的部分笔记。
LECTURE 17(属性文法)
1、以前的语言都会存在一些未定义行为,比如C语言的序列点如下图:
类似lambda语言的操作语义可以保证确定性,但是因为存在了过多运行时细节,编译人员并不喜欢操作语义(如下图),而是希望一种更抽象的表示方法。
2、属性文法(Attribute Grammars),先求语义再进行变换,是在文法上添加了属性和属性的约束规则。注意,每一条约束规则都有两个含义,一个是相等,一个是依赖关系。如下图:
对于单个符号,其含义由符号的一组属性决定,如类型、值、位置等。对于一个串,其含义就是一棵加上属性文法的语法树。如下图:
3、补码的例子如下图。S是符号位,bit是终结符(一位二进制数):
对应语法树如下图:
4、中缀表达式翻译为后缀表达式,如下图:
这就是一种编译器,对应语法树如下图:
5、中缀表达式翻译为抽象语法树,如下图:
对应语法树如下图:
6、C语言风格的声明,如下图:
对应语法树如下图。这个的计算顺序稍微有些不同,不是从叶子结点往上算,而是从S那边开始从上往下计算右子树。