分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系package inter; import lexer.; import symbols.; public class SetElem extends Stmt { public Id array; public Expr index; public Expr expr; public SetElem(Access x, Expr y) { array = x.array; index = x.index; expr = y; if ( check(x.type, expr.type) == null ) error("type error"); } public Type check(Type p1, Type p2) { if ( p1 instanceof Array || p2 instanceof Array ) return null; else if ( p1 == p2 ) return p2; else if ( Type.numeric(p1) && Type.numeric(p2) ) return p2; else return null; } public void gen(int b, int a) { String s1 = index.reduce().toString(); String s2 = expr.reduce().toString(); emit(array.toString() + " [ " + s1 + " ] = " + s2); } }
时间: 2023-05-28 22:06:57 浏览: 153
SetElem是一个继承自Stmt的类,它表示对数组元素的赋值操作。它有三个成员变量:array表示数组的标识符,index表示数组元素的下标,expr表示要赋的值。
SetElem有一个构造函数,它接受一个Access类型的参数x和一个Expr类型的参数y。Access包含了数组标识符和下标,SetElem会将它们分别赋值给array和index。同时,它会将y赋值给expr。在构造函数中,它会调用check函数来检查类型是否匹配,如果不匹配则会报错。
check函数用于检查类型是否匹配,它接受两个Type类型的参数p1和p2。如果p1和p2中有一个是Array类型,则返回null,表示类型不匹配。如果p1和p2相等,则返回p2。如果p1和p2都是numeric类型,则返回p2,否则返回null。
SetElem类依赖于Access、Expr和Type类,需要导入这些类。同时,它也被其他类调用,因为它表示了对数组元素的赋值操作。
相关问题
分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系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类,其包名为inter。
该类有以下成员函数:
1. static int count = 0;:静态成员变量count,用于记录创建的Temp对象数量。
2. int number = 0;:成员变量number,用于记录当前Temp对象的编号。
3. public Temp(Type p):构造函数,调用父类Expr的构造函数,传入两个参数Word.temp和p,其中Word.temp表示该表达式为临时变量。
4. public String toString():将当前Temp对象转换为字符串,返回格式为"t" + number,即"t"加上该对象的编号。
该类没有其他成员函数。
该类的调用关系:
该类没有调用其他类的成员函数,也没有被其他类调用。
分析源代码中的每个类的成员函数及其作用,分析源代码中的不同类的调用关系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成员变量可以用于链接不同符号表之间的关系。
阅读全文