编译原理期末复习

少了代码优化的那道题,那道题是22-秋占分最大的题,也要好好复习。

词法分析

2018

7639c89919e04c88a0e17b547b4996c0.png

23b173de750240d19a90a85d327e356f.png

3ea38d64c0504d8eb4a8232478327030.png

2019

3e5c087b224e40639660bea8f7d71918.png

ec153170d1e94664970658f9e9b25b5e.png

2020

f7be78112d114d4d899636599a281049.png

50fed6965de045a793e71c66ddb8e7fa.png

语法分析

2018

141205efb8634a8fa8003bda60ee78e0.png

65d4d14515a744eabd4a157d32c96efa.png

71bee3d6054e4d329dbacb4c1b094f43.png

2019

bb027f17787e425e93d37ab3c019960f.png

ac9b2c22eea54c9398d5ba37ecc9de8b.png

3753236ea9e44032bc6b72f4c8b1e988.png

2020

f993f88d71a640f0b8d0fce286eda94f.png

1b925925aaf54ffdb1203eb9b2b5c541.png

4f282a70d3964c46bf05e7b2a1da87bd.png

语法制导翻译

2018

三.语法制导翻译(10分)
考虑以下文法:
S → id = E | if E then S | while E do S | begin S; S end | break
写出一个翻译方案,其语义动作的作用是:若发现break不是出现在循环语句中,及时报告错误。

S‘ → {S.loop = false} S
S → id = E 
S → if E then {S1.loop = S.loop} S1
S → begin {S1.loop = S.loop} S1; {S2.loop = S.loop} S2 end
S → break {if(S.loop==false) print("Error\n")}

2019

三.语义分析和语法制导翻译(20分)
考虑描述表达式规则的文法CFG,其非终结符集合为{E},终结符集合为{n, true, false}。文法产生式如下:

E -> n

   | true

   | false

   | E + E

| E && E

假设其语义规则为:每个表达式E都有一个类型,且E+E类型的表达式中两个子表达式都必须是整型的n,E && E类型的表达式中两个子表达式都必须是布尔型的true或false。
回答以下问题:
1)(10分)给出一段伪代码,能完成上述语言的语义分析,当输入表达式语义错误时报错,否则返回输入表达式的类型(假设抽象语法树已经建立好,词法分析已完成);
2)(10分)用语法制导定义SDD的方法描述上述语义分析的语义动作,并指出该SDD中的属性哪些是综合属性、哪些是继承属性。

(1)伪代码如下:

Type process(E){
    if(E的类型为int或bool) return E的类型;
    else if(E的类型为加法表达式){
        if(process(E的左子表达式)和process(E的右子表达式)结果均为整型) {
            计算E的值;
            return E的类型;
        }
        else {
            print("Error\n");
            exit(1);
        }
    }
    else{
        if(process(E的左子表达式)和process(E的右子表达式)结果均为布尔型) {
            计算E的值;
            return E的类型;
        }
        else {
            print("Error\n");
            exit(1);
        } 
    }
}

(2)

E → n {E.type = int}
E → true {E.type = bool;E.val = true}
E → false{E.type = bool;E.val = false}
E → E1 + E2 {if(E1.type!=int || E2.type!=int) print("error");
                        else{
                                E.type = int;
                                E.val = E1.val + E2.val
                        }
                        }
E → E1 && E2 {if(E1.type!=bool || E2.type!=bool) print("error");
                        else{
                                E.type = bool;
                                E.val = E1.val && E2.val
                        }
                        }

type和val均为综合属性

样题

02e5f43b208e4c3c850fec7405dd694e.png

E → T {R.i = T.val} R {E.val = R.s}
R → + T {R1.i = R.i + T.val} R1 {R.s = R1.s}
R → - T {R1.i = R.i - T.val} R1 {R.s = R1.s}
R → ε {R.s = R.i}
T → (E) {T.val = E.val}
T → num {T.val = num.val}

《编译》——复习资料,可适用于课程学习资料、期末复习资料、自主学习资料等等,复习资料共218页,内容丰富,干货十足! 主要内容包括: 一、概述 1 1.1 课程介绍 1 1.2 编译过程 3 1.3 高级语言程序简介 11 二、程序语言概论 14 2.1 程序语言的定义 14 2.2 文法的形式化定义和分类 18 2.3 文法和语言 22 2.4 语法分析树 29 三、词法分析_1 33 3.1 词法分析概述 33 3.2 词法分析程序的设计 38 3.3 正规式与自动机 41 3.3.1 正规式与正规集 41 3.3.2 确定有限自动机(DFA) 44 3.3.3 非确定有限自动机(NFA) 49 3.4 单元测试 51 四、词汇分析_2 52 4.1正则式和有限自动机的等价 52 五、词法分析_3 59 5.1 DFA的化简 59 六、词法分析_4 62 6.1 词法分析器的自动生成 62 6.2 词法分析程序实现实例 64 七、语法分析—自上而下分析_1 71 7.1 词法分析简介 71 7.2 自顶向下分析简介 73 7.3 消除左递归和回溯 76 八、语法分析—自上而下分析_2 80 8.1 LL(1)分析法 80 8.2 FIRST集和FOLLOW集的构造 82 8.3 单元测试 85 九、语法分析—自上而下分析_3 86 9.1 LL(1)分析表的构造 86 9.2 递归子程序的原理 89 9.3 单元测试 95 十、语法分析—自下而上分析_1 96 10.1 自下而上分析方法的基本思想 96 10.2 分析树与规范规约 99 10.3 符号栈的使用 103 10.4 单元测试 105 十一、语法分析—自下而上分析_2 106 11.1 算符优先文法 106 11.2 优先表构造 109 11.3 算符优先分析算法 112 10.4 单元测试 115 十二、语法分析—自下而上分析_3 116 12.1 LR分析器 116 12.2 LR分析过程 119 12.3 单元测试 132 十三、语法分析—自下而上分析_4 133 13.1 构造识别前缀的DFA 133 13.2 LR(0)项目集规范族构造 140 13.3 由DFA构造LR(0)分析表 146 13.4 单元测试 150 十六、属性文法和语法翻译制导 151 16.1 L-属性文法和自顶向下翻译 151 16.2 自下而上计算继承属性 159 十七、语义分析和中间代码产生_1 166 17.1 语义分析的任务 166 17.2 中间代码的生成 168 17.3 算术表达式和赋值语句 175 17.4 单元测试 178 十八、语义分析和中间代码产生_2 179 18.1 布尔表达式的作用和文法描述 179 18.2 做控制用布尔表达式的翻译(回填) 181 18.3 控制流语句的翻译 186 18.4 控制流语句的翻译(回填) 189 十九、代码优化_1 194 19.1 什么是代码优化 194 19.2 基本块及流图 199 19.3 单元测试 202 二十、代码优化_2 203 20.1 基本块的DAG表示及其作用 203 二十一、重要知识点 213 1. 考试内容及分数分布 213 2. 名词解释 214 3. 简答题 215 4. 结语 216
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值