编译原理之S/L-属性文法和翻译模式以及源程序的中间表示

1.S-属性文法

含义:只包含综合属性的文法(只计算左部符号的属性)

2.L-属性文法

含义:既可以包含综合属性,也可以包含继承属性,但要求产生式右边某文法符号的继承属性的计算只取决于该符号左边符号的属性

3.基于S-属性文法的语义计算(自底向上)

4.基于L-属性文法的语义计算

采用自顶向下深度优先从左至右遍历分析数的方法,计算出所有的属性值

假设语法树已经建立且树中已带有开始符号的继承属性和终结符的综合属性

算法如下:

while(含有未被计算的属性)
{
    VisitNode(S);      //S是开始符号
    procedure VistiNode( N : node);
    begin:
    {
    if(N为非终结符)    //假设N -> X1,X2...Xm*
        {
        for(i := 1 to  m)
            {
            if(Xi∈Vn)    //Xi为非终结符
                {
                begin:
                计算Xi所有能够计算的继承属性
                VisitNode(Xi);
                end;
                }
            }
        }
    else end;

例子:

首先区分继承属性,综合属性以及副作用:

红线标注为继承属性,铅笔标注为副作用,其他未标注的是综合属性

5.基于翻译模式的语义计算

允许由{ }括起来的语义动作出现在产生式右端的任意位置,以此显式的表达属性计算的次序

(1)S-翻译模式:是一种仅涉及综合属性的情形,通常将语义动作放在相应产生式右端的末尾

如图,仅涉及综合属性:

(2)L-翻译模式:既可以包含继承属性,也可以包含综合属性,但是要满足求继承属性的计算放在该符号之前,产生式左部综合属性的计算放在产生式的尾部

6.生成抽象语法树(AST)

对输入串按照翻译模式进行语义计算

(1)若该SDT的基础文法是二义性的,则构造LR分析表,进行自底向上的句型分析

(2)基础文法是无二义性的,可以采用LR分析,也可以采用遍历语法分析树进行计算

抽象语法树中每一个子树的根节点都对应一种动作或者运算,它的所有子节点对应该动作或者运算的参数或者运算数

例题:

构造AST的技巧

7.逆波兰表达式

(1)表达式构造AST,后根遍历

(2)按照相应的翻译模式进行语义计算

(3)将中缀表达式转换为后缀的算法

8.四元式序列

(运算符,运算分量,运算分量,结果)

其中,运算分量和结果可以是变量,常量或临时变量

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译器将源代码转换为目标代码的过程分为四个阶段:词法分析、语法分析、语义分析和代码生成。下面是编译器处理 C 程序的过程和输出的各种程序表示。 1. 词法分析 词法分析器将源代码分解成一个个单词,即词法单元,例如关键字、标识符、常量等。词法分析器会忽略注释和空格,并将单词转换为内部表示形式。 2. 语法分析 语法分析器将词法单元转换为语法树,同时检查语法错误。语法树是一种树状结构,表示程序中语句的层次结构。语法分析器使用上下文无关文法(CFG)来描述语法规则,例如 if 语句、while 循环等。 3. 语义分析 语义分析器检查语义错误,例如类型不匹配、重复定义等。在 C 语言中,语义分析器还负责解析头文件、函数调用、数组下标访问等复杂的语法结构。 4. 代码生成 代码生成器将语法树转换为目标代码,即汇编语言或机器码。代码生成器通过优化算法来生成高效的代码。优化算法包括常量折叠、死代码删除、循环展开等。 在编译器生成目标代码的过程中,还会输出各种程序表示,包括: 1. 符号表:存储程序中定义的变量和函数的信息,例如名称、类型、作用域等。 2. 中间代码:是一种抽象的程序表示形式,类似于汇编语言,但是更容易优化和转换。 3. 目标代码:是最终的程序表示形式,可以直接在计算机上运行。目标代码可以是汇编语言或机器码。 总之,编译器是将高级语言转换为计算机能够执行的机器代码的过程。在此过程中,编译器会输出各种程序表示形式,用于调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值