编译原理实验三,四
编译原理实验三,四
语义分析 通常包括 (1)类型检查。验证程序中执行的每个操作是否 遵守语言的类型系统的过程.,编译程序必须报告不 符合类型系统的信息。 (2)控制流检査。控制流语句必须使控制转移到 合法的地方 (3)一致性检查。在很多场合要求对象只能被定 义一次。例如 Pasca语言规定同一标识符在一个分 程序中只能被说明一次等等 (4)名字的作用域分析
语义分析 通常包括: (1)类型检查。验证程序中执行的每个操作是否 遵守语言的类型系统的过程.,编译程序必须报告不 符合类型系统的信息。 (2)控制流检查。控制流语句必须使控制转移到 合法的地方。 (3)一致性检查。在很多场合要求对象只能被定 义一次。例如Pascal语言规定同一标识符在一个分 程序中只能被说明一次等等。 (4)名字的作用域分析
语义分析 *语义分析的要求请参看。例子见后。 *语义分析需要用到 Bison/yacc语言中的 “语义值类型定义”和“语义动作”使 用部分。(教材附录有,不再讲述)
语义分析 语义分析的要求请参看。例子见后。 语义分析需要用到Bison/Yacc语言中的 “语义值类型定义”和“语义动作”使 用部分。(教材附录有,不再讲述)
语义分析的例子 w Type equivalence and compatibility w Two base types are equivalent if and only if they are the same exact type BoolEXpr ExprI$$= Check BoolExprUsage(&@1, $1); * Check BoolExprUsageo中检查$即 Expr的ype是否是boo类型的
语义分析的例子 Type equivalence and compatibility Two base types are equivalent if and only if they are the same exact type. BoolExpr : Expr { $$ = CheckBoolExprUsage(&@1, $1); } CheckBoolExprUsage()中检查$1即 Expr的type是否是bool类型的
变量的类型 *在pp3中我们要获得变量的类型 *在我们给的 StartLes里面,为了简单起 见,我们将expr、 Simple Stmt等也定义 为type类型。同学们可自行选择
变量的类型 在pp3中我们要获得变量的类型。 在我们给的StartFiles里面,为了简单起 见,我们将expr、SimpleStmt等也定义 为type类型。同学们可自行选择
sc。pe符号表 * Scope类起到符号表的作用。在 scope. h中定 义了 static Scope* stack[MaxNestLevel]; *每进入一个 scope( Globalfunction,Cass,Loca就会在 stack顶端加入一项,退出这个 scope时就把 该项退栈。 Scope内的标识符都加入 scope内 部的加入 hashtable中 *退出一个cope时,打印出这个 scope内的所 有标识符及其信息
Scope—符号表 Scope类起到符号表的作用。在scope.h中定 义了static Scope* stack[MaxNestLevel]; 每进入一个 scope(Global,Function,Class,Local)就会在 stack顶端加入一项,退出这个scope时就把 该项退栈。Scope内的标识符都加入scope内 部的加入hashtable中。 退出一个scope时,打印出这个scope内的所 有标识符及其信息
四种 Scope Global Scope 全局变量,类定义,main函数。 Local Scope 函数内部的临时变量 Class Scope 类内部的成员变量和方法 Function Scope 函数的参数
四种scope Global Scope 全局变量,类定义,main函数。 Local Scope 函数内部的临时变量。 Class Scope 类内部的成员变量和方法。 Function Scope 函数的参数
*int test(int c int d) Exiting local scope Contents * void main( (line 4 variable type int int c s: (line 5) string si variable type string Exiting function 'main scope. Contents: s =Whello' Exiting local scope c= test(4, 5)i Contents: Exiting function ' test Print(c) scope. Contents Print(s)i a:(1ine13) variable, type int 3 variable type int int test (int a int b Exiting global scope Contents main:(line 3) return a t b function test: (line 13) function
int test(int c, int d); void main() { 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. 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
Main Local scope String s Main Fundtion Scope Empty Global main
Global Main Function Scope Main Local Scope main Empty Int c String s
实验三要求 *实验要求:完成语义分析,结果同 sample一致,扩展不做要求。 *上交日期:三周以后即128日晚12:00 上载到1661116886 compiler/soft *提交方法:同以前一样。 *欢迎同学用不同的方法实现相同的功能。 如自己设计符号表、类的实现等
实验三要求 实验要求:完成语义分析,结果同 sample一致,扩展不做要求。 上交日期:三周以后即12.8日晚12:00 上载到166.111.68.86 compiler/soft 提交方法:同以前一样。 欢迎同学用不同的方法实现相同的功能。 – 如自己设计符号表、类的实现等