public ClassRec(AstId cid) { _id = cid; _parent = null; _vars = new List<VarRec>(); _methods = new Dictionary<String, MethodRec>(); }
public MethodRec(AstId id, AstType type) { _id = id; _rtype = type; _params = new List<VarRec>(); _locals = new List<VarRec>(); }
public ClassRec GetClass(AstId cid) { if (!_classRecs.ContainsKey(cid.s)) throw new SymbolException("Class " + cid.s + " not defined"); return _classRecs[cid.s]; }
public void AddParam(AstId id, DemiTasse.ast.AstType type) { if (GetParam(id) != null) throw new SymbolException("Param " + id.s + " already defined"); _params.Add(new VarRec(id, type, VarRec.PARAM, _params.Count + 1)); }
public void AddClassVar(AstId vid, DemiTasse.ast.AstType type, AstExp e) { if(GetClassVar(vid) != null) throw new SymbolException("ClassVar " + vid.s + " already defined"); _vars.Add(new VarRec(vid, type, VarRec.CLASS, _vars.Count+1, e)); }
public VarRec(AstId id, AstType type, int kind, int idx) { _id = id; _type = type; _kind = kind; _idx = idx; _init = null; }
public void AddLocal(AstId vid, DemiTasse.ast.AstType type) { if (GetLocal(vid) != null) throw new SymbolException("Var " + vid.s + " already defined"); _locals.Add(new VarRec(vid, type, VarRec.LOCAL, _locals.Count + 1)); }
public VarRec(AstId id, AstType type, int kind, int idx, AstExp e) { _id = id; _type = type; _kind = kind; _idx = idx; _init = e; }
public void AddClass(AstId cid) { if (_classRecs.ContainsKey(cid.s)) { throw new SymbolException("Class " + cid.s + " already defined"); } else { _classRecs.Add(cid.s, new ClassRec(cid)); } }
public AstCallStmt(AstExp astExp, AstId astId, AstExpList astExpList) { _obj = astExp; _mid = astId; _el = astExpList; }
/* throws ParseException */ /* final */ public static AstExp astExp() { AstType t; AstToken n; AstRelop.OP relop; AstBinop.OP binop; AstUnop.OP unop; AstExp e, e1, e2; AstExpList el; jj_consume_token(AstRegExpId.kw56); switch ((jj_ntk == AstRegExpId.UNDEFINED)?jj_ntk_fn():jj_ntk) { case AstRegExpId.kwArrayElm: jj_consume_token(AstRegExpId.kwArrayElm); e1 = astExp(); e2 = astExp(); e = new AstArrayElm(e1,e2); break; case AstRegExpId.kwArrayLen: jj_consume_token(AstRegExpId.kwArrayLen); e1 = astExp(); e = new AstArrayLen(e1); break; case AstRegExpId.kwBinop: jj_consume_token(AstRegExpId.kwBinop); binop = binOp(); e1 = astExp(); e2 = astExp(); e = new AstBinop(binop,e1,e2); break; case AstRegExpId.kwBoolVal: jj_consume_token(AstRegExpId.kwBoolVal); switch ((jj_ntk == AstRegExpId.UNDEFINED)?jj_ntk_fn():jj_ntk) { case AstRegExpId.kwTrue: jj_consume_token(AstRegExpId.kwTrue); e = new AstBoolVal(true); break; case AstRegExpId.kwFalse: jj_consume_token(AstRegExpId.kwFalse); e = new AstBoolVal(false); break; default: jj_la1[12] = jj_gen; jj_consume_token(AstRegExpId.UNDEFINED); throw new AstParseException(); } break; case AstRegExpId.kwCall: jj_consume_token(AstRegExpId.kwCall); e1 = astExp(); e2 = astExp(); el = astExpList(); e = new AstCall(e1,(AstId)e2,el); break; case AstRegExpId.kwId: jj_consume_token(AstRegExpId.kwId); n = jj_consume_token(AstRegExpId.ID); e = new AstId(n.image); break; case AstRegExpId.kwIntVal: jj_consume_token(AstRegExpId.kwIntVal); n = jj_consume_token(AstRegExpId.INTVAL); e = new AstIntVal(int.Parse(n.image)); break; case AstRegExpId.kwField: jj_consume_token(AstRegExpId.kwField); e1 = astExp(); e2 = astExp(); e = new AstField(e1,(AstId)e2); break; case AstRegExpId.kwNewArray: jj_consume_token(AstRegExpId.kwNewArray); t = astType(); n = jj_consume_token(AstRegExpId.INTVAL); e = new AstNewArray((AstType)t, int.Parse(n.image)); break; case AstRegExpId.kwNewObj: jj_consume_token(AstRegExpId.kwNewObj); e1 = astExp(); el = astExpList(); e = new AstNewObj((AstId)e1,el); break; case AstRegExpId.kwRelop: jj_consume_token(AstRegExpId.kwRelop); relop = relOp(); e1 = astExp(); e2 = astExp(); e = new AstRelop(relop, e1, e2); break; case AstRegExpId.kwStrVal: jj_consume_token(AstRegExpId.kwStrVal); n = jj_consume_token(AstRegExpId.STRVAL); String s = n.image; e = new AstStrVal(s.Substring(1, s.Length-2)); break; case AstRegExpId.kwThis: jj_consume_token(AstRegExpId.kwThis); e = new AstThis(); break; case AstRegExpId.kwUnop: jj_consume_token(AstRegExpId.kwUnop); unop = unOp(); e1 = astExp(); e = new AstUnop(unop,e1); break; case AstRegExpId.kwNullExp: jj_consume_token(AstRegExpId.kwNullExp); e = null; break; default: jj_la1[13] = jj_gen; jj_consume_token(AstRegExpId.UNDEFINED); throw new AstParseException(); } jj_consume_token(AstRegExpId.kw57); {if (true) return e;} throw new Error("Missing return statement in function"); }
public AstClassDecl(AstId ci, AstId pi, AstVarDeclList avl, AstMethodDeclList aml) { cid = ci; pid = pi; vl = avl; ml = aml; }
public VarRec GetVar(ClassRec c, AstId vid) { VarRec v; while (c != null) { if ((v = c.GetClassVar(vid)) != null) return v; c = c.Parent(); } throw new SymbolException("Var " + vid.s + " not defined"); }
// *** partial implementation, will be fixed in proj2 **** // Id --- // string s; public IrExp visit(AstId n) { VarRec v; if (currMethod != null) { if ((v = currMethod.GetLocal(n)) != null) return new IrVar(v.Idx); if ((v = currMethod.GetParam(n)) != null) return new IrParam(v.Idx); } v = symTable.GetVar(currClass, n); return new IrField(new IrParam(0), v.Idx - 1); }
public VarRec GetLocal(AstId vid) { for (int i = 0; i < _locals.Count; i++) { VarRec v = _locals[i]; if (v.Id().s.Equals(vid.s)) return v; } return null; }
public AstField(AstExp e, AstId v) { obj = e; var = v; }
public MethodRec GetMethod(AstId mid) { if (!_methods.ContainsKey(mid.s)) return null; return _methods[mid.s]; // may return null }
public AstVarDecl(AstType at, AstId i, AstExp ae) { t = at; var = i; e = ae; }
public MethodRec GetMethod(ClassRec c, AstId mid) { MethodRec m; while (c != null) { if ((m = c.GetMethod(mid)) != null) return m; c = c.Parent(); } throw new SymbolException("Method " + mid.s + " not defined"); }
public AstType visit(AstId n) { return null; }
public string UniqueMethodName(ClassRec c, AstId mid) { MethodRec m; while (c != null) { if ((m = c.GetMethod(mid)) != null) return c.Id().s + "_" + mid.s; c = c.Parent(); } throw new SymbolException("Method " + mid.s + " not defined"); }
public VarRec GetParam(AstId vid) { for (int i = 0; i < _params.Count; i++) { VarRec v = _params[i]; if (v.Id().s.Equals(vid.s)) return v; } return null; }
// This --- public AstType visit(AstThis n) { AstId cid = new AstId(currClass.Id().s); return new AstObjType(cid); }
public void AddMethod(AstId mid, DemiTasse.ast.AstType rtype) { if (_methods.ContainsKey(mid.s)) throw new SymbolException("Method " + mid.s + " already defined"); MethodRec m = new MethodRec(mid, rtype); _methods.Add(mid.s, m); }
/* throws Exception */ // Id --- // String s; public AstType visit(AstId n) { VarRec id = symTable.GetVar(currClass, currMethod, n); return id.Type(); }
public VarRec GetClassVar(AstId vid) { for (int i = 0; i < _vars.Count; i++) { VarRec v = _vars[i]; if (v.Id().s.Equals(vid.s)) return v; } return null; }
public AstNewObj(AstId id, AstExpList el) { cid = id; args = el; }
public AstCall(AstExp e, AstId mi, AstExpList el) { obj = e; mid = mi; args = el; }
public AstMethodDecl(AstType at, AstId i, AstFormalList afl, AstVarDeclList avl, AstStmtList asl) { t=at; mid=i; fl=afl; vl=avl; sl=asl; }
public VarRec GetVar(ClassRec c, MethodRec m, AstId vid) { VarRec v; if (m != null) { if ((v = m.GetLocal(vid)) != null) return v; if ((v = m.GetParam(vid)) != null) return v; } return GetVar(c, vid); }