- 1、本文档共17页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理实验三四
编译原理实验三,四 语义分析 语义分析的要求请参看The Decaf Language。例子见后。 语义分析需要用到Bison/Yacc语言中的“语义值类型定义”和“语义动作”使用部分。(教材附录有,不再讲述) 语义分析的例子 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中我们要获得变量的类型。 在我们给的StartFiles里面,为了简单起见,我们将expr、SimpleStmt等也定义为type类型。同学们可自行选择。 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 函数的参数。 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; } 实验三要求 实验要求:完成语义分析,结果同sample一致,扩展不做要求。 上交日期:三周以后即12.8日晚12:00上载到166.111.68.86 compiler/soft 提交方法:同以前一样。 欢迎同学用不同的方法实现相同的功能。 如自己设计符号表、类的实现等。 实验四 代码生成 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: BeginFuncWithParams; 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) StmtBlock 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; _t1 = 12; a = _t1; _t2 =
文档评论(0)