分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package inter; import symbols.*; public class Else extends Stmt { Expr expr; Stmt stmt1, stmt2; public Else(Expr x, Stmt s1, Stmt s2) { expr = x; stmt1 = s1; stmt2 = s2; if( expr.type != Type.Bool ) expr.error("boolean required in if"); } public void gen(int b, int a) { int label1 = newlabel(); // label1 for stmt1 int label2 = newlabel(); // label2 for stmt2 expr.jumping(0,label2); // fall through to stmt1 on true emitlabel(label1); stmt1.gen(label1, a); emit("goto L" + a); emitlabel(label2); stmt2.gen(label2, a); } }
时间: 2023-05-29 21:04:02 浏览: 67
该类 Else 继承了 Stmt 类,表示 if-else 语句中的 else 部分。该类有三个成员变量:expr、stmt1 和 stmt2,分别表示 else 部分的条件表达式、if 部分的语句和 else 部分的语句。
该类的构造函数 Else(Expr x, Stmt s1, Stmt s2) 接收三个参数,分别是条件表达式、if 部分的语句和 else 部分的语句。在构造函数中,首先将这三个参数分别赋值给成员变量 expr、stmt1 和 stmt2。然后判断条件表达式的类型是否为布尔型,如果不是则调用 error() 函数报错。
该类还有一个 gen(int b, int a) 函数,用于生成中间代码。首先定义两个标签 label1 和 label2,分别表示 if 部分和 else 部分的入口。然后调用条件表达式的 jumping() 函数,将其跳转到标签 label2,表示当条件为 false 时执行 else 部分的语句。接着生成标签 label1,并生成 if 部分的中间代码,其中跳转语句的目标标签为 a。最后生成标签 label2,并生成 else 部分的中间代码。
相关问题
分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package inter; import lexer.*; import symbols.*; public class Temp extends Expr { static int count = 0; int number = 0; public Temp(Type p) { super(Word.temp, p); number = ++count; } public String toString() { return "t" + number; } }
该代码中只有一个类:Temp。
该类的成员函数及其作用:
1. 构造函数public Temp(Type p):用于创建一个新的Temp对象,该对象的类型为Type p,同时给该对象的number成员赋值为count的值。
2. toString()函数:返回该对象的字符串表示,格式为"t"加上该对象的number成员的值。
该类的调用关系:该类没有调用其他类的函数,也没有被其他类调用。
分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package symbols; import java.util.*; import lexer.*; import inter.*; public class Env { private Hashtable table; protected Env prev; public Env(Env n) { table = new Hashtable(); prev = n; } public void put(Token w, Id i) { table.put(w, i); } public Id get(Token w) { for( Env e = this; e != null; e = e.prev ) { Id found = (Id)(e.table.get(w)); if( found != null ) return found; } return null; } }
这个类定义了一个符号表,用于存储标识符和对应的符号。它主要有以下几个成员函数:
1. Env(Env n):构造函数,创建一个新的符号表,并将其前一个符号表设置为n。
2. put(Token w, Id i):将标识符i和对应的符号w插入到符号表中。
3. get(Token w):从符号表中查找并返回与符号w对应的标识符。它首先从当前符号表开始查找,如果找不到则继续在前一个符号表中查找,直到找到或遍历完所有符号表。
在编译器中,符号表是一个非常重要的数据结构,用于存储标识符和对应的符号,在语义分析和代码生成中都会用到。Env类提供了查找和插入标识符的方法,使得编译器能够方便地管理符号表。在编译器中,通常会创建多个符号表,用于存储不同作用域中的标识符,Env类的prev成员变量可以用于链接不同符号表之间的关系。