コード例 #1
0
ファイル: Program.cs プロジェクト: Ryuuke/Ryu
        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();
        }
コード例 #2
0
ファイル: SoltysLispVM.cs プロジェクト: soltys/Melange
        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);
        }
コード例 #3
0
 public CodeGenParserListener(
     LLVMExecutionEngineRef ee,
     LLVMPassManagerRef passManager,
     CodeGenVisitor visitor)
 {
     _visitor     = visitor;
     _ee          = ee;
     _passManager = passManager;
 }
コード例 #4
0
 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);
     }
 }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        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}";
        }
コード例 #7
0
        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;
            }
        }
コード例 #8
0
        /// <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"));
            }
        }
コード例 #9
0
        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);
        }
コード例 #10
0
ファイル: Program.cs プロジェクト: breeve1/ADNUG-Antlr
        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);
        }