Exemplo n.º 1
0
        public static InterfaceDefn CreateInterface(ModuleDefn m, ParseNode x)
        {
            string        name = x.GetChild("name").ToString();
            InterfaceDefn r    = new InterfaceDefn(m, name);

            ParseNode inherits = x.GetChild("inherits");

            if (inherits != null)
            {
                foreach (ParseNode node in inherits.Children)
                {
                    r.AddBaseInterface(CreateTypeRef(node));
                }
            }

            ParseNode methods = x.GetChild("methods");

            if (methods != null)
            {
                foreach (ParseNode node in methods.Children)
                {
                    FunctionDefn f = CreateMethod(node, r);
                    r.AddMethod(f);
                }
            }

            m.AddInterface(r);
            return(r);
        }
Exemplo n.º 2
0
        public static ModuleDefn CreateModule(ProgramDefn pd, ParseNode x, string sFileName)
        {
            ParseNode  nameNode = x.GetChild(0);
            ModuleDefn r        = new ModuleDefn(pd, nameNode.ToString(), sFileName);

            ParseNode bodyNode = x.GetChild(1);

            CreateModuleDefn(r, bodyNode);

            // Now store all of the types
            for (int i = 2; i < x.GetNumChildren(); ++i)
            {
                ParseNode child = x.GetChild(i);
                switch (child.Label)
                {
                case "class":
                    CreateClass(r, child);
                    break;

                case "interface":
                    CreateInterface(r, child);
                    break;

                case "enum":
                    CreateEnum(r, child);
                    break;

                default:
                    throw new Exception("Unrecognized module sub-element " + child.Label);
                }
            }

            return(r);
        }
Exemplo n.º 3
0
 public void ResolveAllTypes(ModuleDefn global, ModuleDefn m)
 {
     foreach (Expression x in GetExpressionTree())
     {
         x.ResolveTypes(global, m);
     }
 }
Exemplo n.º 4
0
 public void ResolveTypes(ModuleDefn global, ModuleDefn m)
 {
     foreach (FormalArg a in this)
     {
         a.type.Resolve(global, m);
     }
 }
Exemplo n.º 5
0
 public void ResolveTypes(ModuleDefn global, ModuleDefn m)
 {
     if (baseclass != null)
     {
         baseclass.Resolve(global, m);
     }
     for (int i = 0; i < interfaces.Count; ++i)
     {
         interfaces[i].Resolve(global, m);
         HeronType     t  = interfaces[i].type;
         InterfaceDefn id = t as InterfaceDefn;
         if (id == null)
         {
             throw new Exception(t.name + " is not an interface");
         }
     }
     foreach (FieldDefn f in GetFields())
     {
         f.ResolveTypes(global, m);
     }
     foreach (FunctionDefn f in GetAllMethods())
     {
         f.ResolveTypes(global, m);
     }
 }
Exemplo n.º 6
0
 public override void ResolveTypes(ModuleDefn global, ModuleDefn m)
 {
     foreach (Expression field in fields)
     {
         field.ResolveTypes(global, m);
     }
     fielddefs.ResolveTypes(global, m);
 }
Exemplo n.º 7
0
 public HeronType(ModuleDefn m, Type t, string name)
 {
     module = m;
     type = t;
     Debug.Assert(t != null);
     this.name = name;
     StoreExposedFunctionsAndFields();
 }
Exemplo n.º 8
0
        public void ResolveTypes(ModuleDefn global, ModuleDefn m)
        {
            foreach (TypeRef tr in basetypes)
                tr.Resolve(global, m);

            foreach (FunctionDefn f in GetAllMethods())
                f.ResolveTypes(global, m);
        }
Exemplo n.º 9
0
 public HeronType(ModuleDefn m, Type t, string name)
 {
     module = m;
     type   = t;
     Debug.Assert(t != null);
     this.name = name;
     StoreExposedFunctionsAndFields();
 }
Exemplo n.º 10
0
 public ModuleInstance(ModuleDefn m)
     : base(m, null)
 {
     if (m == null)
     {
         throw new Exception("Missing module definition");
     }
 }
Exemplo n.º 11
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="f"></param>
 /// <param name="self"></param>
 public Frame(FunctionDefn f, ClassInstance self, ModuleInstance mi)
 {
     this.function = f;
     this.self = self;
     moduleInstance = mi;
     if (self != null)
         moduleDef = self.Type.GetModule();
     AddScope(new Scope());
 }
Exemplo n.º 12
0
 public void Resolve(ModuleDefn global, ModuleDefn m)
 {
     type = m.FindType(name);
     if (type == null)
         type = global.FindType(name);
     if (type == null)
         throw new Exception("Could not resolve type " + name);
     if (type.name != name)
         throw new Exception("Internal error during type resolution of " + name);
 }
Exemplo n.º 13
0
        public ModuleDefn GetModuleDefn()
        {
            ModuleDefn m = Type as ModuleDefn;

            if (m == null)
            {
                throw new Exception("Missing module");
            }
            return(m);
        }
Exemplo n.º 14
0
        /// <summary>
        /// Instantiates a module, evaluates the meta function, then
        /// evaluates the main function.
        /// </summary>
        /// <param name="m"></param>
        public void RunModule(ModuleDefn m)
        {
            ModuleInstance mi = m.Instantiate(this, new HeronValue[] { }, null) as ModuleInstance;

            if (RunMeta(mi))
            {
                // Re-instantiate,
                mi = m.Instantiate(this, new HeronValue[] { }, null) as ModuleInstance;
            }
            RunMain(mi);
        }
Exemplo n.º 15
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="f"></param>
 /// <param name="self"></param>
 public Frame(FunctionDefn f, ClassInstance self, ModuleInstance mi)
 {
     this.function  = f;
     this.self      = self;
     moduleInstance = mi;
     if (self != null)
     {
         moduleDef = self.Type.GetModule();
     }
     AddScope(new Scope());
 }
Exemplo n.º 16
0
        /// <summary>
        /// Loads, parses, and executes a file.
        /// </summary>
        /// <param name="s"></param>
        static public void RunFile(string sFile)
        {
            VM vm = new VM();

            vm.InitializeVM();
            ModuleDefn m = vm.LoadModule(sFile);

            vm.LoadDependentModules(sFile);
            vm.ResolveTypes();
            vm.RunModule(m);
        }
Exemplo n.º 17
0
        static public InterfaceDefn ParseInterface(ModuleDefn m, string s)
        {
            ParseNode node = ParserState.Parse(HeronGrammar.Interface, s);

            if (node == null)
            {
                return(null);
            }
            InterfaceDefn r = CodeModelBuilder.CreateInterface(m, node);

            return(r);
        }
Exemplo n.º 18
0
        static public ClassDefn ParseClass(ModuleDefn m, string s)
        {
            ParseNode node = ParserState.Parse(HeronGrammar.Class, s);

            if (node == null)
            {
                return(null);
            }
            ClassDefn r = CodeModelBuilder.CreateClass(m, node);

            return(r);
        }
Exemplo n.º 19
0
        static public ModuleDefn ParseModule(ProgramDefn p, string s, string fileName)
        {
            ParseNode node = ParserState.Parse(HeronGrammar.Module, s);

            if (node == null)
            {
                return(null);
            }
            ModuleDefn r = CodeModelBuilder.CreateModule(p, node, fileName);

            return(r);
        }
Exemplo n.º 20
0
        public void ResolveTypes(ModuleDefn global, ModuleDefn m)
        {
            foreach (TypeRef tr in basetypes)
            {
                tr.Resolve(global, m);
            }

            foreach (FunctionDefn f in GetAllMethods())
            {
                f.ResolveTypes(global, m);
            }
        }
Exemplo n.º 21
0
        public void InitializeVM()
        {
            globalModule = new ModuleDefn(null, "_global_", "_internal_");
            RegisterPrimitives();
            program = new ProgramDefn("_program_", globalModule);

            // Clear all the frames
            frames.Clear();
            result = null;

            // Push an empty first frame and scope
            PushNewFrame(null, null, null);
            PushScope();
        }
Exemplo n.º 22
0
 public virtual void ResolveTypes(ModuleDefn global, ModuleDefn m)
 {
     foreach (FieldInfo fi in GetInstanceFields())
     {
         if (fi.FieldType.Equals(typeof(TypeRef)))
         {
             TypeRef tr = fi.GetValue(this) as TypeRef;
             if (tr == null)
             {
                 throw new Exception("The type-reference field cannot be null");
             }
             tr.Resolve(global, m);
         }
     }
 }
Exemplo n.º 23
0
        public ModuleDefn LoadModule(string sFileName)
        {
            ModuleDefn m = CodeModelBuilder.ParseFile(program, sFileName);

            program.AddModule(m);
            string sFileNameAsModuleName = sFileName.Replace('/', '.').Replace('\\', '.');

            sFileNameAsModuleName = Path.GetFileNameWithoutExtension(sFileNameAsModuleName);
            int n = sFileNameAsModuleName.IndexOf(m.name);

            if (n + m.name.Length != sFileNameAsModuleName.Length)
            {
                throw new Exception("The module name '" + m.name + "' does not correspond to the file name '" + sFileName + "'");
            }
            return(m);
        }
Exemplo n.º 24
0
 public void Resolve(ModuleDefn global, ModuleDefn m)
 {
     type = m.FindType(name);
     if (type == null)
     {
         type = global.FindType(name);
     }
     if (type == null)
     {
         throw new Exception("Could not resolve type " + name);
     }
     if (type.name != name)
     {
         throw new Exception("Internal error during type resolution of " + name);
     }
 }
Exemplo n.º 25
0
        static public ModuleDefn ParseFile(ProgramDefn p, string sFileName)
        {
            ParseNode node;
            string    sFileContents = File.ReadAllText(sFileName);

            try
            {
                node = ParserState.Parse(HeronGrammar.File, sFileContents);
            }
            catch (ParsingException e)
            {
                Console.WriteLine("Parsing exception occured in file " + sFileName);
                Console.WriteLine("at character " + e.context.col + " of line " + e.context.row);
                Console.WriteLine(e.context.msg);
                Console.WriteLine(e.context.line);
                Console.WriteLine(e.context.ptr);
                throw;
            }

            if (node == null)
            {
                Console.WriteLine("Ill-formed Heron file " + sFileName);
                throw new Exception();
            }

            try
            {
                ModuleDefn r = CodeModelBuilder.CreateModule(p, node, sFileName);
                return(r);
            }
            catch (ParsingException e)
            {
                Console.WriteLine("Parsing exception occured in file " + sFileName);
                Console.WriteLine("at character " + e.context.col + " of line " + e.context.row);
                Console.WriteLine(e.context.msg);
                Console.WriteLine(e.context.line);
                Console.WriteLine(e.context.ptr);
                throw;
            }
            catch (Exception e)
            {
                Console.WriteLine("Error occured during construction of code model in file " + sFileName);
                Console.WriteLine(e.Message);
                throw;
            }
        }
Exemplo n.º 26
0
        public void ResolveTypes(ModuleDefn global, ModuleDefn m)
        {
            // ResolveType the return type
            rettype.Resolve(global, m);

            // ResolveType the argument types
            foreach (FormalArg arg in formals)
            {
                arg.type.Resolve(global, m);
            }

            // Resolve the types of body
            foreach (Statement st in body.GetStatementTree())
            {
                st.ResolveTypes(global, m);
            }
        }
Exemplo n.º 27
0
 /// <summary>
 /// Closes open dendencies
 /// </summary>
 /// <param name="mi"></param>
 public void SatisfyOpenDependencies(ModuleDefn m)
 {
     if (dependencies.ContainsKey(m.name))
     {
         if (dependencies[m.name] != null)
         {
             throw new Exception(m.name + " is already parsed and loaded");
         }
         else
         {
             dependencies[m.name] = m;
         }
     }
     else
     {
         dependencies.Add(m.name, m);
     }
 }
Exemplo n.º 28
0
 /// <summary>
 /// Closes open dendencies
 /// </summary>
 /// <param name="mi"></param>
 public void SatisfyOpenDependencies(ModuleDefn m)
 {
     if (dependencies.ContainsKey(m.name))
     {
         if (dependencies[m.name] != null)
         {
             throw new Exception(m.name + " is already parsed and loaded");
         }
         else
         {
             dependencies[m.name] = m;
         }
     }
     else
     {
         dependencies.Add(m.name, m);
     }
 }
Exemplo n.º 29
0
        public static EnumDefn CreateEnum(ModuleDefn m, ParseNode x)
        {
            string   name = x.GetChild("name").ToString();
            EnumDefn r    = new EnumDefn(m, name);

            ParseNode values = x.GetChild("values");

            if (values != null)
            {
                foreach (ParseNode node in values.Children)
                {
                    r.AddValue(node.ToString());
                }
            }

            m.AddEnum(r);
            return(r);
        }
Exemplo n.º 30
0
        public static ClassDefn CreateClass(ModuleDefn m, ParseNode x)
        {
            string    name = x.GetChild("name").ToString();
            ClassDefn r    = new ClassDefn(m, name);

            ParseNode inherits = x.GetChild("inherits");

            if (inherits != null)
            {
                if (inherits.GetNumChildren() != 1)
                {
                    throw new Exception("A class can only inherit from exactly one other class");
                }
                ParseNode type = inherits.GetChild(0);
                r.SetBaseClass(CreateTypeRef(type));
            }

            ParseNode implements = x.GetChild("implements");

            if (implements != null)
            {
                foreach (ParseNode node in implements.Children)
                {
                    r.AddImplementedInterface(CreateTypeRef(node));
                }
            }

            ParseNode methods = x.GetChild("methods");

            if (methods != null)
            {
                foreach (ParseNode node in methods.Children)
                {
                    FunctionDefn f = CreateMethod(node, r);
                    r.AddMethod(f);
                }
            }

            ProcessFields(x, r);

            m.AddClass(r);
            return(r);
        }
Exemplo n.º 31
0
        public static FunctionDefn CreateMethod(ParseNode x, HeronType parent)
        {
            ModuleDefn   module = parent.GetModule();
            FunctionDefn r      = new FunctionDefn(parent);

            r.annotations = CreateAnnotations(x);
            r.node        = x;
            ParseNode fundecl = x.GetChild("fundecl");

            r.name    = fundecl.GetChild("name").ToString();
            r.formals = CreateFormalArgs(fundecl.GetChild("arglist"));
            ParseNode rt = x.GetChild("typedecl");

            r.rettype = CreateTypeRef(rt);
            ParseNode codeblock = x.GetChild("codeblock");

            r.body = CreateCodeBlock(codeblock);
            return(r);
        }
Exemplo n.º 32
0
        public void ResolveTypes(ProgramDefn prog, ModuleDefn global)
        {
            if (HasBaseClass())
            {
                string     s          = GetInheritedClassName();
                ModuleDefn baseModule = prog.GetModule(s);
                SetBaseClass(new TypeRef(baseModule));
            }

            foreach (InterfaceDefn i in GetInterfaces())
            {
                i.ResolveTypes(global, this);
            }
            foreach (ClassDefn c in GetClasses())
            {
                c.ResolveTypes(global, this);
            }

            base.ResolveTypes(global, this);
        }
Exemplo n.º 33
0
        /// <summary>
        /// Adds new dependencies, based on imported modules
        /// </summary>
        /// <param name="mi"></param>
        public void AddNewDependencies(ModuleDefn m)
        {
            foreach (string s in m.GetImportedModuleNames())
            {
                if (!dependencies.ContainsKey(s))
                {
                    dependencies.Add(s, null);
                }
            }

            // There may also be an imported class
            if (m.HasBaseClass())
            {
                string s = m.GetInheritedClassName();
                if (!dependencies.ContainsKey(s))
                {
                    dependencies.Add(s, null);
                }
            }
        }
Exemplo n.º 34
0
        public void ResolveTypes(ModuleDefn global, ModuleDefn m)
        {
            foreach (FieldInfo fi in GetInstanceFields())
            {
                if (fi.FieldType.Equals(typeof(HeronType)))
                {
                    HeronType t = fi.GetValue(this) as HeronType;
                    fi.SetValue(this, t.Resolve(global, m));
                }
                else if (fi.FieldType.Equals(typeof(VarDesc)))
                {
                    VarDesc vd = fi.GetValue(this) as VarDesc;
                    vd.ResolveTypes(global, m);
                }
            }

            foreach (Expression x in GetSubExpressions())
            {
                x.ResolveAllTypes(global, m);
            }
        }
Exemplo n.º 35
0
        public void AddFields(ModuleInstance inst, ModuleInstance parent)
        {
            inst.AddField(new VarDesc("thismodule"), inst);

            foreach (FieldDefn field in GetFields())
            {
                inst.AddField(field);
            }

            if (GetBaseClass() != null)
            {
                ModuleDefn baseMod = GetBaseClass() as ModuleDefn;
                if (baseMod == null)
                {
                    throw new Exception("The base type of the module must be a module: " + GetBaseClass().name);
                }

                ModuleInstance baseInst = new ModuleInstance(baseMod);
                baseMod.AddFields(baseInst, parent);
                inst.AddField(new VarDesc("basemodule"), baseInst);
            }
        }
Exemplo n.º 36
0
 public ProgramDefn(string name, ModuleDefn global)
 {
     this.name = name;
     this.global = global;
 }
Exemplo n.º 37
0
 public void AddModule(ModuleDefn m)
 {
     SatisfyOpenDependencies(m);
     AddNewDependencies(m);
     modules.Add(m);
 }
Exemplo n.º 38
0
        /// <summary>
        /// Adds new dependencies, based on imported modules
        /// </summary>
        /// <param name="mi"></param>
        public void AddNewDependencies(ModuleDefn m)
        {
            foreach (string s in m.GetImportedModuleNames())
            {
                if (!dependencies.ContainsKey(s))
                    dependencies.Add(s, null);
            }

            // There may also be an imported class
            if (m.HasBaseClass())
            {
                string s = m.GetInheritedClassName();
                if (!dependencies.ContainsKey(s))
                    dependencies.Add(s, null);
            }
        }
Exemplo n.º 39
0
 /// <summary>
 /// Instantiates a module, evaluates the meta function, then 
 /// evaluates the main function. 
 /// </summary>
 /// <param name="m"></param>
 public void RunModule(ModuleDefn m)
 {
     ModuleInstance mi = m.Instantiate(this, new HeronValue[] { }, null) as ModuleInstance;
     if (RunMeta(mi))
     {
         // Re-instantiate, 
         mi = m.Instantiate(this, new HeronValue[] { }, null) as ModuleInstance;
     }
     RunMain(mi);
 }
Exemplo n.º 40
0
 public EnumDefn(ModuleDefn m, string name)
     : base(m, typeof(EnumDefn), name)
 {
 }
Exemplo n.º 41
0
        public void ResolveTypes(ProgramDefn prog, ModuleDefn global)
        {
            if (HasBaseClass())
            {
                string s = GetInheritedClassName();
                ModuleDefn baseModule = prog.GetModule(s);
                SetBaseClass(new TypeRef(baseModule));
            }

            foreach (InterfaceDefn i in GetInterfaces())
                i.ResolveTypes(global, this);
            foreach (ClassDefn c in GetClasses())
                c.ResolveTypes(global, this);

            base.ResolveTypes(global, this);
        }
Exemplo n.º 42
0
        public void ResolveTypes(ModuleDefn global, ModuleDefn m)
        {
            foreach (FieldInfo fi in GetInstanceFields())
            {
                if (fi.FieldType.Equals(typeof(HeronType)))
                {
                    HeronType t = fi.GetValue(this) as HeronType;
                    fi.SetValue(this, t.Resolve(global, m));
                }
                else if (fi.FieldType.Equals(typeof(VarDesc)))
                {
                    VarDesc vd = fi.GetValue(this) as VarDesc;
                    vd.ResolveTypes(global, m);
                }
            }

            foreach (Expression x in GetSubExpressions())
                x.ResolveAllTypes(global, m);
        }
Exemplo n.º 43
0
 public ModuleInstance(ModuleDefn m)
     : base(m, null)
 {
     if (m == null)
         throw new Exception("Missing module definition");
 }
Exemplo n.º 44
0
 public virtual HeronType Resolve(ModuleDefn global, ModuleDefn m)
 {
     return this;
 }
Exemplo n.º 45
0
 public void ResolveTypes(ModuleDefn global, ModuleDefn m)
 {
     type.Resolve(global, m);
 }
Exemplo n.º 46
0
 public void SetModule(ModuleDefn m)
 {
     module = m;
 }
Exemplo n.º 47
0
        public void InitializeVM()
        {
            globalModule = new ModuleDefn(null, "_global_", "_internal_");
            RegisterPrimitives();
            program = new ProgramDefn("_program_", globalModule);

            // Clear all the frames
            frames.Clear();
            result = null;

            // Push an empty first frame and scope
            PushNewFrame(null, null, null);
            PushScope();
        }
Exemplo n.º 48
0
 public HeronUserType(ModuleDefn m, Type t, string name)
     : base(m, t, name)
 {
 }
Exemplo n.º 49
0
 public InterfaceDefn(ModuleDefn m, string name)
     : base(m, typeof(InterfaceDefn), name)
 {
 }