编译原理实验三,四.ppt_第1页
编译原理实验三,四.ppt_第2页
编译原理实验三,四.ppt_第3页
编译原理实验三,四.ppt_第4页
编译原理实验三,四.ppt_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、Two 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*

3、stackMaxNestLevel; 每进入一个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

4、() int 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 int s: (line 5) variable , type string Exiting function main scope. Contents: Exiting local scope. Contents: Exiting function test scope

5、. Contents: a: (line 13) variable , type int b: (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 提交方法:同以前一样。 欢迎同学用不同的方法实现相同的功能。 如自己设计符号表、类的实现等。,实验四

6、代码生成,TAC指令 Variable declarations Assignment Arithmetic Relational/equality/logical Labels and Branches Function/method calls Function definitions Memory references Array indexing Object fields method dispatch Miscellaneous Data specification,简单的例子,void main () Print(“hello world”); ,Main: BeginFuncW

7、ithParams; Var _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) Stm

8、tBlock Decl - 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;

9、 _t1 = 12; a = _t1; _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周末

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论