编译原理实验三,四

上传人:wt****50 文档编号:55693660 上传时间:2018-10-04 格式:PPT 页数:17 大小:123KB
返回 下载 相关 举报
编译原理实验三,四_第1页
第1页 / 共17页
编译原理实验三,四_第2页
第2页 / 共17页
编译原理实验三,四_第3页
第3页 / 共17页
编译原理实验三,四_第4页
第4页 / 共17页
编译原理实验三,四_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《编译原理实验三,四》由会员分享,可在线阅读,更多相关《编译原理实验三,四(17页珍藏版)》请在金锄头文库上搜索。

1、编译原理实验三,四,语义分析,通常包括: (1)类型检查。验证程序中执行的每个操作是否遵守语言的类型系统的过程.,编译程序必须报告不符合类型系统的信息。 (2)控制流检查。控制流语句必须使控制转移到合法的地方。 (3)一致性检查。在很多场合要求对象只能被定义一次。例如Pascal语言规定同一标识符在一个分程序中只能被说明一次等等。(4)名字的作用域分析,语义分析,语义分析的要求请参看。例子见后。 语义分析需要用到Bison/Yacc语言中的“语义值类型定义”和“语义动作”使用部分。(教材附录有,不再讲述),语义分析的例子,Type equivalence and compatibilityTw

2、o base types are equivalent if and only if they are the same exact type. BoolExpr : Expr $ = CheckBoolExprUsage( CheckBoolExprUsage()中检查$1即Expr的type是否是bool类型的。,变量的类型,在pp3中我们要获得变量的类型。 在我们给的StartFiles里面,为了简单起见,我们将expr、SimpleStmt等也定义为type类型。同学们可自行选择。,Scope符号表,Scope类起到符号表的作用。在scope.h中定义了static Scope* st

3、ackMaxNestLevel; 每进入一个scope(Global,Function,Class,Local)就会在stack顶端加入一项,退出这个scope时就把该项退栈。Scope内的标识符都加入scope内部的加入hashtable中。 退出一个scope时,打印出这个scope内的所有标识符及其信息。,四种scope,Global Scope全局变量,类定义,main函数。 Local Scope函数内部的临时变量。 Class Scope类内部的成员变量和方法。 Function Scope函数的参数。,int test(int c, int d);void main() int

4、c;string s;s = “hello“;c = test(4, 5);Print(c);Print(s); int test(int a, int b) return a + b; ,Exiting local scope. Contents: c: (line 4) variable , type ints: (line 5) variable , type string Exiting function main scope. Contents: Exiting local scope. Contents: Exiting function test scope. Contents:

5、 a: (line 13) variable , type intb: (line 13) variable , type int Exiting global scope. Contents: main: (line 3) function test: (line 13) function,实验三要求,实验要求:完成语义分析,结果同sample一致,扩展不做要求。 上交日期:三周以后即12.8日晚12:00上载到166.111.68.86 compiler/soft 提交方法:同以前一样。 欢迎同学用不同的方法实现相同的功能。 如自己设计符号表、类的实现等。,实验四 代码生成,TAC指令 V

6、ariable declarations Assignment Arithmetic Relational/equality/logical Labels and Branches Function/method calls Function definitions Memory references Array indexing Object fields method dispatch MiscellaneousData specification,简单的例子,void main ()Print(“hello world”); ,Main: BeginFuncWithParams; Var

7、 _t0; _t0 = “hello world”; Lcall _PrintString(_t0); EndFunc,DeclList - Type - Void Formals - Constant - stringConstant Expr - Constant Expr - Expr PrintStmt - Print ( ExprList ) Stmt - PrintStmt StmtList - StmtList Stmt StmtBlock - StmtList FunctionDefn - Type identifier ( Formals) StmtBlock Decl -

8、FunctionDefn DeclList - DeclList Decl Program - DeclList,Main: BeginFuncWithParams;Var _t0; _t0 = “hello world”;Lcall _PrintString(_t0);EndFunc,更复杂的表达式,void main() int b; Int a; b = 3; a = 12; a = (b*3)/6; ,Main: BeginFuncWithParams; Var b; Var a; Var _t0; _t0 = 3; b = _t0; Var _t1; _t1 = 12; a = _t

9、1; _t2 = 3; Var _t3; _t3 = b * _t2; Var _t4; _t4 = 6; Var _t5; _t5 = _t3 / _t4; a = _t5; EndFunc,数组。(略)在pp4中,我们取消double,保留integer, 而string和其他对象用指针存储,所以所有的变量大小都是4.在计算数组的地址的时候,用公式arr+4*i;注意:数组的下标越界检查。函数调用。注意:Decaf中函数传的参数都是值参,即参数值的改变不影响原来变量的值。,类,继承,Decaf的继承比较简单。 每个类都有一个隐藏的this变量。 子类继承所有父类的变量和方法,但是类内部变量对于除它的子类外是不可访问的。 如果子类要重载父类的方法,只需要实现一个和父类相同的方法就可以了。反之亦然。 类只能在global scope中实现。,实验要求,说明: 6周以后,即16周末12:00之前上交。 识别run time error对正确的decaf文件能够生成Tac代码。 Pp3提交以后交给大家pp4的start files,但是同学也可以在pp3的基础上直接完成,需要注意的是部分文件可能需要改动。 Sample文件大家自己生成吧,可以先用例子里的程序。 参考资料。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号