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); }
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)); }
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)); }
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); }
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); }
public DRegion(string name, DyCodeModel body, Location loc) : base(NodeType.TestBlock, loc) => (Name, Body) = (name, body);
public Result <Unit> Compile(DyCodeModel codeModel) { var unit = builder.Build(codeModel); return(Result.Create(unit, builder.Messages)); }