예제 #1
0
        public static Dictionary <string, SemanticType> BuildSystemType()
        {
            Dictionary <string, SemanticType> solve = new Dictionary <string, SemanticType>();

            var Object   = new SemanticType("Object");
            var SelfType = new SemanticType("SELF_TYPE");
            var String   = new SemanticType("String", Object);
            var Int      = new SemanticType("Int", Object);
            var IO       = new SemanticType("IO", Object);
            var Bool     = new SemanticType("Bool", Object);

            var abort     = new SemanticMethod("abort", Object);
            var type_name = new SemanticMethod("type_name", String);
            var copy      = new SemanticMethod("copy", SelfType);

            Object.Methods = new List <SemanticMethod> {
                abort, type_name, copy
            };


            var length    = new SemanticMethod("length", Int);
            var concat    = new SemanticMethod("concat", String, new SemanticAttr[] { new SemanticAttr("x", String) });
            var substring = new SemanticMethod("substr", String, new SemanticAttr[] { new SemanticAttr("i", Int), new SemanticAttr("l", Int) });

            String.Methods = new List <SemanticMethod> {
                length, concat, substring
            };

            var out_string = new SemanticMethod("out_string", SelfType, new SemanticAttr[] { new SemanticAttr("x", String) });
            var out_int    = new SemanticMethod("out_int", SelfType, new SemanticAttr[] { new SemanticAttr("x", Int) });
            var in_string  = new SemanticMethod("in_string", String);
            var in_int     = new SemanticMethod("in_int", Int);

            IO.Methods = new List <SemanticMethod> {
                out_string, out_int, in_string, in_int
            };

            foreach (var item in (new SemanticType[] { Object, Int, IO, SelfType, String, Bool }))
            {
                solve.Add(item.Name, item);
            }

            return(solve);
        }
예제 #2
0
        public SemanticMethod ChangeType(SemanticType t)
        {
            var l = new List <SemanticAttr>();

            foreach (var item in AttrParams)
            {
                if (item.Type.Name == "SELF_TYPE")
                {
                    l.Add(item.ChangeType(t));
                }
                else
                {
                    l.Add(item);
                }
            }
            var solve = new SemanticMethod(Name, ReturnType, AttrParams);

            solve.Self = Self;
            if (solve.ReturnType.Name == "SELF_TYPE")
            {
                solve.ReturnType = t;
            }
            return(solve);
        }