Example #1
0
        public bool Visit(AST_CaseOf node)
        {
            if (!node.expr.Visit(this))
            {
                return(false);
            }

            var types = new List <SemanticType>();

            foreach (var item in node.props.Propertys)
            {
                CurrContext = CurrContext.CreateChild();

                if (!item.decl.Visit(this))
                {
                    if (!CurrContext.NullFather())
                    {
                        CurrContext = CurrContext.GetParent();
                    }
                    return(false);
                }
                if (!item.exp.Visit(this))
                {
                    if (!CurrContext.NullFather())
                    {
                        CurrContext = CurrContext.GetParent();
                    }
                    return(false);
                }
                CurrContext = CurrContext.GetParent();
                types.Add(item.exp.MyType);
            }


            SemanticType lca = types[0];

            for (int i = 1; i < types.Count; i++)
            {
                lca = SemanticType.LCA(lca, types[i]);
            }

            node.MyType = lca;

            return(true);
        }
Example #2
0
        public bool Visit(AST_CaseOf node)
        {
            if (!node.expr.Visit(this))
            {
                return(false);
            }
            foreach (var item in node.props.Propertys)
            {
                if (!item.exp.Visit(this))
                {
                    return(false);
                }
                if (!item.decl.id.Visit(this))
                {
                    return(false);
                }
            }

            return(true);
        }
        public bool Visit(AST_CaseOf node)
        {
            if (!(node.expr is AST_Id) && !node.expr.Visit(this))
            {
                return(false);
            }

            foreach (var item in node.props.Propertys)
            {
                CurrContext = CurrContext.CreateChild();
                CurrContext.Define(item.decl.id.Id);
                if (!item.exp.Visit(this))
                {
                    return(false);
                }
                CurrContext = CurrContext.GetParent();
            }

            return(true);
        }
Example #4
0
        public string Visit(AST_CaseOf node)
        {
            var s       = node.expr.Visit(this);
            var solve   = methodcontext.GenLocal("exp", true);
            var typexpr = methodcontext.GenLocal("get_type", true);
            var besti   = methodcontext.GenLocal("best_type", true);

            var cmp = methodcontext.GenLocal("comp", true);

            methodcontext.Staments.Add(new CIL_TypeOf(s, typexpr));

            var endlab = methodcontext.GenLabel("end");

            methodcontext.Staments.Add(new CIL_ExceptionCond(typexpr, "0", "error_null"));

            methodcontext.Staments.Add(new CIL_Asig(besti, "10000", "Int"));

            List <string> typeval = new List <string>();

            foreach (var item in node.props.Propertys)
            {
                typeval.Add(methodcontext.GenLocal("type", true));
            }

            for (int i = 0; i < typeval.Count; i++)
            {
                methodcontext.Staments.Add(new CIL_TypeOf(node.props.Propertys[i].decl.type.Type, typeval[i]));
                methodcontext.Staments.Add(new CIL_FunctionCall("descend", new CIL_Params(new List <string> {
                    typeval[i], typexpr
                }), null, typeval[i], false, null));
                methodcontext.Staments.Add(new CIL_ExpBin(besti, typeval[i], "<", cmp));
                var iff = methodcontext.GenLabel("if");
                methodcontext.Staments.Add(new CIL_If_Goto(cmp, iff));
                methodcontext.Staments.Add(new CIL_Asig(besti, typeval[i], "var"));
                methodcontext.Staments.Add(new CIL_Label(iff));
            }

            List <string> labelsok = new List <string>();

            for (int i = 0; i < typeval.Count; i++)
            {
                labelsok.Add(methodcontext.GenLabel("ok"));
            }

            methodcontext.Staments.Add(new CIL_ExceptionCond(besti, "10000", "error_null"));

            for (int i = 0; i < typeval.Count; i++)
            {
                methodcontext.Staments.Add(new CIL_ExpBin(besti, typeval[i], "=", cmp));
                methodcontext.Staments.Add(new CIL_If_Goto(cmp, labelsok[i]));
            }

            for (int i = 0; i < typeval.Count; i++)
            {
                methodcontext.Staments.Add(new CIL_Label(labelsok[i]));

                methodcontext.AddContext("case");


                string id = methodcontext.GenLocal(node.props.Propertys[i].decl.id.Id, false);
                methodcontext.Staments.Add(new CIL_Asig(id, s, "var"));
                string idexp = node.props.Propertys[i].exp.Visit(this);
                methodcontext.Staments.Add(new CIL_Asig(solve, idexp, "var"));

                methodcontext.ClearContext();


                methodcontext.Staments.Add(new CIL_Goto(endlab));
            }

            methodcontext.Staments.Add(new CIL_Label(endlab));


            return(solve);
        }
Example #5
0
 public bool Visit(AST_CaseOf node)
 {
     throw new NotImplementedException();
 }
Example #6
0
 public Base_Object_Value Visit(AST_CaseOf node)
 {
     throw new NotImplementedException();
 }