public static void CompileRoot(FunctionDeclarationNode root, Assembly assembly, Action<string> onError) { DCPUC.Scope.Reset(); var scope = new DCPUC.Scope(); var end_of_program = new Variable(); end_of_program.location = Register.STATIC; end_of_program.name = "__endofprogram"; end_of_program.staticLabel = "ENDOFPROGRAM"; end_of_program.emitBrackets = false; scope.variables.Add(end_of_program); var library = new List<String>(System.IO.File.ReadAllLines("libdcpuc.txt")); //root.InsertLibrary(library); try { root.CompileFunction(assembly, scope); foreach (var dataItem in DCPUC.Scope.dataElements) { var datString = ""; foreach (var item in dataItem.Item2) { datString += item; datString += ", "; } assembly.Add(":" + dataItem.Item1, "DAT", datString.Substring(0, datString.Length - 2)); } assembly.Add(":ENDOFPROGRAM", "", ""); } catch (DCPUC.CompileError c) { onError(c.Message); return; } }
public static FunctionDeclarationNode Parse(String code, Action<string> onError) { var program = Parser.Parse(code); if (onError == null) onError = (a) => { }; if (program.HasErrors()) { foreach (var msg in program.ParserMessages) { onError(msg.Level + ": " + msg.Message + " [line:" + msg.Location.Line + " column:" + msg.Location.Column + "]\r\n"); onError(extractLine(code, msg.Location.Line) + "\r\n"); onError(new String(' ', msg.Location.Column) + "^\r\n"); } return null; } DCPUC.Scope.Reset(); var root = program.Root.AstNode as DCPUC.CompilableNode; var newRoot = new FunctionDeclarationNode(); newRoot.ChildNodes.Add(root); return newRoot; }