Exemple #1
0
 public ClassRec(AstId cid)
 {
     _id = cid;
     _parent = null;
     _vars = new List<VarRec>();
     _methods = new Dictionary<String, MethodRec>();
 }
Exemple #2
0
 public MethodRec(AstId id, AstType type)
 {
     _id = id;
     _rtype = type;
     _params = new List<VarRec>();
     _locals = new List<VarRec>();
 }
Exemple #3
0
        public ClassRec GetClass(AstId cid)
        {
            if (!_classRecs.ContainsKey(cid.s))
                throw new SymbolException("Class " + cid.s + " not defined");

            return _classRecs[cid.s];
        }
Exemple #4
0
        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));
        }
Exemple #5
0
        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));
        }
Exemple #6
0
 public VarRec(AstId id, AstType type, int kind, int idx)
 {
     _id = id;
     _type = type;
     _kind = kind;
     _idx = idx;
     _init = null;
 }
Exemple #7
0
        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));
        }
Exemple #8
0
 public VarRec(AstId id, AstType type, int kind, int idx, AstExp e)
 {
     _id = id;
     _type = type;
     _kind = kind;
     _idx = idx;
     _init = e;
 }
Exemple #9
0
 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));
     }
 }
Exemple #10
0
 public AstCallStmt(AstExp astExp, AstId astId, AstExpList astExpList)
 {
     _obj = astExp;
     _mid = astId;
     _el = astExpList;
 }
Exemple #11
0
        /* 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");
        }
Exemple #12
0
 public AstClassDecl(AstId ci, AstId pi, AstVarDeclList avl, AstMethodDeclList aml)
 {
     cid = ci; pid = pi; vl = avl; ml = aml;
 }
Exemple #13
0
 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");
 }
Exemple #14
0
        // *** 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);
        }
Exemple #15
0
 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;
 }
Exemple #16
0
 public AstField(AstExp e, AstId v)
 {
     obj = e; var = v;
 }
Exemple #17
0
        public MethodRec GetMethod(AstId mid)
        {
            if (!_methods.ContainsKey(mid.s))
                return null;

            return _methods[mid.s]; // may return null
        }
Exemple #18
0
 public AstVarDecl(AstType at, AstId i, AstExp ae)
 {
     t = at;
     var = i;
     e = ae;
 }
Exemple #19
0
 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");
 }
Exemple #20
0
 public AstType visit(AstId n)
 {
     return null;
 }
Exemple #21
0
 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");
 }
Exemple #22
0
 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;
 }
Exemple #23
0
 // This ---
 public AstType visit(AstThis n)
 {
     AstId cid = new AstId(currClass.Id().s);
     return new AstObjType(cid);
 }
Exemple #24
0
        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);
        }
Exemple #25
0
 /* throws Exception */
 // Id ---
 // String s;
 public AstType visit(AstId n)
 {
     VarRec id = symTable.GetVar(currClass, currMethod, n);
     return id.Type();
 }
Exemple #26
0
        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;
        }
Exemple #27
0
 public AstNewObj(AstId id, AstExpList el)
 {
     cid = id; args = el;
 }
Exemple #28
0
 public AstCall(AstExp e, AstId mi, AstExpList el)
 {
     obj = e; mid = mi; args = el;
 }
Exemple #29
0
 public AstMethodDecl(AstType at, AstId i, AstFormalList afl, 
 AstVarDeclList avl, AstStmtList asl)
 {
     t=at; mid=i; fl=afl; vl=avl; sl=asl;
 }
Exemple #30
0
 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);
 }