solveTypes(BRAQParser.ProgramContext context, Dictionary <BRAQParser.Function_def_stmtContext, AssignCheckVisitor.AssignCheckResult> step1_result, List <Type> imported_names) { var answ = new Dictionary <BRAQParser.Function_def_stmtContext, TyperResult>(); var user_functions = new List <OwnMethodInfo>(); //function signatures foreach (var fdef in step1_result) { var tr = new TyperResult(fdef.Value.token_to_def, fdef.Value.token_to_arg.Keys.ToList()); tr.methodInfo = new OwnMethodInfo( fdef.Key.id_name.Text, fdef.Key.typed_id().Select(x => new Pair <string, Type>(x.id_name.Text, string_to_type(x.type_name.Text, imported_names))).ToList(), fdef.Key.of_type != null ? string_to_type(fdef.Key.of_type.Text, imported_names): typeof(void), fdef.Key ); user_functions.Add(tr.methodInfo); tr.argtypes = tr.methodInfo.arguments.ToDictionary(x => x.a, x => x.b); tr.argvars = fdef.Value.token_to_arg.Keys.ToList(); answ[fdef.Key] = tr; } foreach (var fdef in step1_result) { var v = new TyperVisitor(answ[fdef.Key], fdef.Value.def_to_assign, user_functions); v.imported_names = imported_names; fdef.Key.Accept(v); } return(answ); }
public static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Expected single argument as a source file"); return; } if (!File.Exists(args[0])) { Console.WriteLine("No file found"); return; } string input = File.ReadAllText(args[0]); string prefixed_name = args[0].Split(".".ToCharArray())[0] + ".exe"; var lexer = new BRAQLexer(new AntlrInputStream(input)); var tokenStream = new CommonTokenStream(lexer); //Console.WriteLine(tokenStream); var parser = new BRAQParser(tokenStream); var ast = parser.program(); var imported_names = ImportVisitor.GetImports(ast); var assigningResults = AssignCheckVisitor.getAssigners(ast, imported_names); var typerResult = TyperVisitor.solveTypes(ast, assigningResults, imported_names); Console.WriteLine("solved types and functions"); //checks CheckExecutor.runChecks(ast); //compiling AppDomain domain = AppDomain.CurrentDomain; AssemblyName asname = new AssemblyName(); asname.Name = "BRAQAssembly"; AssemblyBuilder asm = domain.DefineDynamicAssembly(asname, AssemblyBuilderAccess.RunAndSave); ModuleBuilder module = asm.DefineDynamicModule( prefixed_name, prefixed_name); TypeBuilder tpb = module.DefineType( "Program", TypeAttributes.Class); Dictionary <BRAQParser.Function_def_stmtContext, MethodBuilder> methods_to_generate = new Dictionary <BRAQParser.Function_def_stmtContext, MethodBuilder>(); //create function handles foreach (var func in typerResult) { MethodBuilder mb = tpb.DefineMethod(func.Value.methodInfo.name, MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, func.Value.methodInfo.return_type, func.Value.methodInfo.arguments.Select(x => x.b).ToArray()); methods_to_generate[func.Key] = mb; func.Value.methodInfo.method_builder = mb; } foreach (var m in typerResult.Keys) { var mb = typerResult[m].methodInfo.method_builder; ILGenerator method_il = mb.GetILGenerator(); ILVisitor method_visitor = new ILVisitor(method_il, typerResult[m]); m.Accept(method_visitor); } Console.WriteLine("generated code"); tpb.CreateType(); try { var m = typerResult.First(x => x.Key.id_name.Text == "main"); asm.SetEntryPoint(m.Value.methodInfo.method_builder); }catch (InvalidOperationException ignored) {} asm.Save(prefixed_name); }