static void Main(string[] args) { var sw = new Stopwatch(); sw.Start(); var parser = new Parser(); var rootAST = parser.ParseProgramAsync("src/hello.ryu").Result; var symTableManager = new SymbolTableManager(rootAST); symTableManager.GenerateSymbolTables(); var typeInferer = new TypeInferer(symTableManager); var typeChecker = new TypeChecker(symTableManager); var codeGen = new CodeGenVisitor(symTableManager); typeInferer.InferTypes(); typeChecker.TypeCheck(); codeGen.CodeGen(); sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); Console.ReadKey(); }
private IEnumerable <VMFunction> CodeGeneration(IAstNode ast) { var modifiedAst = this.env.Eval(ast); var evalVisitor = new CodeGenVisitor(this.env.Copy()); modifiedAst.Accept(evalVisitor); return(evalVisitor.Functions); }
public CodeGenParserListener( LLVMExecutionEngineRef ee, LLVMPassManagerRef passManager, CodeGenVisitor visitor) { _visitor = visitor; _ee = ee; _passManager = passManager; }
public void CopesWithPropertyAccess() { using var f = TestUtilities.LoadTestResource("Fifth.Test.TestSampleCode.property-access.5th"); if (FifthParserManager.TryParseFile <FifthProgram>(f.Path, out var ast, out var errors)) { var sb = new StringBuilder(); var sut = new CodeGenVisitor(new StringWriter(sb)); sut.VisitFifthProgram(ast); var generatedCode = sb.ToString(); generatedCode.Should().NotBeNullOrWhiteSpace(); Console.WriteLine(generatedCode); } }
static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Red; Console.ForegroundColor = ConsoleColor.Green; Console.Write("Path: "); Console.ForegroundColor = ConsoleColor.Green; Console.ResetColor(); Console.WriteLine("done"); var fileName = args[0]; var AbsolutePath = Path.GetFullPath(fileName); if (ReadFromFile(AbsolutePath, out var text)) { return; } try { var tokenStream = LexInputFile(text); var concreteSyntaxTree = ParseTokens(tokenStream); var ast = concreteSyntaxTree.Accept(new AstBuilderVisitor()); ast.Accept(new SymbolTableVisitor()); ast.Accept(new TypeCheckerVisitor()); var codeGenVisitor = new CodeGenVisitor(); ast.Accept(codeGenVisitor); var program = codeGenVisitor.Program; WriteProgramToFile(program, fileName); } catch (AntlrException ex) { // Antlr writes their own errors } catch (AlangExeption ex) { Console.WriteLine($"[{ex.Node.Start}]: {ex.Message}. Ends at [{ex.Node.Stop}]"); } catch (SymbolExistException ex) { Console.WriteLine(ex.Message); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public SourceCodeHandler(string source, bool generateAssembly) { var scanner = new Scanner(); var parser = new Parser(scanner); //var highlighter = new TextHighlighter(source, scanner, parser); var tree = parser.Parse(source, "", new AstGenerationTree()); PopulateSyntaxTree(tree.Nodes.First(), ParseTree); PopulateTokens(scanner); if (!tree.Errors.Any()) { try { tree.Eval(); var r = Namespaces.Root; var p = AstCreator.GetProgram(); p.Optimize(); ASTTree = p.GetNodes(); //new ControlFlowVisitor().Visit(p); PopulateIdentifierTree(Namespaces.Root, IdentifierTree); if (generateAssembly) { var codeGeneration = new CodeGenVisitor(p); try { codeGeneration.GenerateAssembly($"{AppDomain.CurrentDomain.BaseDirectory}\\output.exe"); } catch (Exception exception) { tree.Errors.Add(new ParseError($"Что-то пошло не так {exception.Message}", 0)); } } } catch (ParseException parseException) { tree.Errors.Add(parseException.Error); } } Errors = tree.Errors; Status = $"Errors: {string.Join(Environment.NewLine, tree.Errors.Select(e => e.ToString()))}{Environment.NewLine}"; }
public void TryCompile() { var codegen = new CodeGenVisitor(); var ast = new CompilationNode(); try { ast.Accept(codegen); } catch (SomethingWentWrongException e) { Console.WriteLine(e.Node.Start); } catch (Exception e) { Console.WriteLine(e); throw; } }
/// <summary> /// Try to compile the source file to an assembly /// </summary> /// <param name="sourceFilename"></param> /// <param name="assemblyFilename"></param> /// <returns></returns> public static bool TryCompile(string sourceFilename, out string assemblyFilename) { var ilFilename = Path.ChangeExtension(sourceFilename, ".il"); try { assemblyFilename = Path.ChangeExtension(sourceFilename, ".exe"); if (FifthParserManager.TryParseFile <AST.Assembly>(sourceFilename, out var ast, out var errors)) { using (var writer = File.CreateText(ilFilename)) { var codeGenVisitor = new CodeGenVisitor(writer); codeGenVisitor.VisitAssembly(ast); } var ilasmPath = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ilasm.exe"; var(result, stdOutputs, stdErrors) = GeneralHelpers.RunProcess(ilasmPath, ilFilename, "/DEBUG", "/EXE", "/NOLOGO", $"/OUTPUT={assemblyFilename}"); if (result != 0) { Console.Write(stdOutputs.Join(s => s, "\n")); Console.Write(stdErrors.Join(s => s, "\n")); } return(result == 0); } return(false); } finally { DeleteFile(ilFilename); DeleteFile(Path.ChangeExtension(sourceFilename, ".tmp")); } }
static void Main(string[] args) { if (args.Length == 0) { return; } var input = new AntlrFileStream(args[0]); var lexer = new CoolLexer(input); var tokens = new CommonTokenStream(lexer); var parser = new CoolParser(tokens); var tree = parser.program(); Context_to_AST astbuilder = new Context_to_AST(); ProgNode program = astbuilder.VisitProgram(tree) as ProgNode; var scope = new Scope(); Console.WriteLine(CheckSemantic(program, scope)); Console.WriteLine("\n"); var code_visitor = new CodeGenVisitor(program, scope); var code = code_visitor.GetIntermediateCode(); foreach (var line in code) { Console.WriteLine(line); } MIPSCodeGenerator generator = new MIPSCodeGenerator(); var mips = generator.GenerateCode(code); Console.WriteLine(mips); File.WriteAllText("result.mips", mips); }
static void Main(string[] args) { string code = @" when [ToPractice] is 'cardiology of bob' *[Insurance] is 'blue cross' +[Insurance] is 'blah' +[Insurance] is 'blah3' *[DocumentCount] greater than 1 *[DocumentCount] less than 3 when [ToPractice] is 'test' *[DocumentCount] greater than 10 "; var lexer = new DslLexer(new ANTLRStringStream(code)); var tokens = new CommonTokenStream(lexer); var parser = new DslParser(tokens); parser.TreeAdaptor = new BridgeAdapter(); var result = parser.program(); //Generate .dot graph. View it at http://mdaines.github.io/viz.js/ var graphGenerator = new DotTreeGenerator(); var dotFile = graphGenerator.ToDot(result.Tree); if (lexer.Errors.Count > 0) { foreach (var error in lexer.Errors) { Console.WriteLine(error); } return; } if (parser.Errors.Count > 0) { foreach (var error in parser.Errors) { Console.WriteLine(error); } return; } var bridge = new BridgeVisitor(result.Tree); var ast = bridge.CreateAst(); var codeGen = new CodeGenVisitor(ast); var codeUnit = codeGen.Generate(); //Code Gen; string codeString = Persist.ToCSharpSource(codeUnit); //Compile var persist = new Persist(codeUnit); var assembly = persist.ToAssembly(); if (persist.Errors.Count > 0) { foreach (var error in persist.Errors) { Console.WriteLine(error); } return; } //Run var instance = assembly.CreateInstance("Code"); var method = assembly.GetType("Code").GetMethod("Run"); var methodArgs = new Args { ToPractice = "test", Insurance = "blue cross", DocumentCount = 5 }; var codeResult = (bool)method.Invoke(instance, new[] { methodArgs }); Console.WriteLine(codeResult); }