Example #1
0
        public Unit Build(DyCodeModel codeModel)
        {
            Messages.Clear();
            unit.FileName = codeModel.FileName;

            //It is used internally, so we need to add it even if the code doesn't reference it
            GetMemberNameId(Builtins.Iterator);

            if (unit.Layouts.Count == 0)
            {
                unit.Layouts.Add(null); //A layout reserved for the top level
            }
            cw.StartFrame();            //Start a new global frame
            var res = TryBuild(codeModel);

            if (!res)
            {
                return(null);
            }

            cw.MarkLabel(programEnd);
            cw.Term(); //Program should always end with this op code
            cw.CompileOpList();

            //Finalizing compilation, fixing top level layout
            unit.Layouts[0] = new MemoryLayout(currentCounter, cw.FinishFrame(), 0);
            return(unit);
        }
Example #2
0
        public Result <DyCodeModel> Parse(SourceBuffer buffer)
        {
            var ip = new InternalParser(new Scanner(buffer));

            ip.Parse();
            var cd = new DyCodeModel(ip.Root, ip.Imports.ToArray(), buffer.FileName ?? MEMORY);

            return(ip.Errors.Count == 0
                ? Result.Create(cd)
                : Result.Create(cd, ip.Errors));
        }
Example #3
0
    public static Result <DyCodeModel> Parse(SourceBuffer buffer)
    {
        var fileName = buffer.FileName ?? DefaultBuffer;
        var ip       = new InternalParser(fileName, new(buffer));

        ip.Parse();
        var cd = new DyCodeModel(ip.Root, ip.Imports.ToArray(), fileName);

        return(ip.Errors.Count == 0
            ? Result.Create(cd)
            : Result.Create(cd, ip.Errors));
    }
Example #4
0
        private bool TryBuild(DyCodeModel codeModel)
        {
            try
            {
                var ctx = new CompilerContext();

                if (!options.NoLangModule && !iterative)
                {
                    BuildImport(defaultInclude, ctx);
                }

                foreach (var imp in codeModel.Imports)
                {
                    BuildImport(imp, ctx);
                }

                //This is a self-reference to simplify type resolution
                unit.UnitIds.Add(0);
                var root = codeModel.Root;

                //What if we have no code, only imports? Useless, but we shouldn't crush in this case
                if (root.Nodes.Count == 0)
                {
                    cw.PushNil();
                }

                for (var i = 0; i < root.Nodes.Count; i++)
                {
                    var n    = root.Nodes[i];
                    var last = i == root.Nodes.Count - 1;
                    Build(n, last ? Push : None, ctx);
                }

                return(Success);
            }
            catch (TerminationException)
            {
                return(false);
            }
#if !DEBUG
            catch (Exception ex)
            {
                throw Ice(ex);
            }
#endif
        }
        protected override Unit CompileNodes(DyCodeModel codeModel, bool root)
        {
            if (!root)
            {
                return(base.CompileNodes(codeModel, root));
            }
            else
            {
                Messages.Clear();
            }

            var oldCompiler = compiler;

            if (compiler == null)
            {
                compiler = new DyCompiler(BuilderOptions, this);
            }
            else
            {
                compiler    = new DyCompiler(compiler);
                startOffset = composition.Units[0].Ops.Count;
            }

            var res = compiler.Compile(codeModel);

            if (res.Messages.Any())
            {
                Messages.AddRange(res.Messages);
            }

            if (!res.Success)
            {
                compiler    = oldCompiler;
                startOffset = null;
                return(null);
            }

            if (startOffset != null)
            {
                res.Value.Layouts[0].Address = startOffset.Value;
            }

            return(res.Value);
        }
Example #6
0
    protected override Unit?CompileNodes(DyCodeModel codeModel, bool root)
    {
        if (!root)
        {
            return(base.CompileNodes(codeModel, root));
        }

        Messages.Clear();

        if (compiler is null)
        {
            compiler = new(BuilderOptions, this);
        }
        else
        {
            compiler = new(compiler);
            var ops = composition !.Units[0]?.Ops;
            startOffset = ops is null ? 0 : ops.Count;
        }

        var res = compiler.Compile(codeModel);

        if (res.Messages.Any())
        {
            Messages.AddRange(res.Messages);
        }

        if (!res.Success)
        {
            compiler    = oldCompiler;
            startOffset = null;
            return(null);
        }

        if (startOffset is not null)
        {
            res.Value !.Layouts[0].Address = startOffset.Value;
        }

        return(res.Value);
    }
Example #7
0
 public DRegion(string name, DyCodeModel body, Location loc) : base(NodeType.TestBlock, loc) =>
     (Name, Body) = (name, body);
Example #8
0
    public Result <Unit> Compile(DyCodeModel codeModel)
    {
        var unit = builder.Build(codeModel);

        return(Result.Create(unit, builder.Messages));
    }