Kecaknoahの構文解析器を定義します。
コード例 #1
0
ファイル: Program.cs プロジェクト: utgwkk/Kecaknoah
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Usage: kecaknoah <input file>");
                return;
            }

            var txt = File.ReadAllText(args[0]);
            var lexer = new KecaknoahLexer();
            var parser = new KecaknoahParser();
            var lr = lexer.AnalyzeFromSource(txt);
            if (!lr.Success)
            {
                Console.WriteLine($"字句解析エラー ({lr.Error.Column}, {lr.Error.Line}): {lr.Error.Message}");
                Console.ReadLine();
                return;
            }
            var ast = parser.Parse(lr);
            if (!ast.Success)
            {
                Console.WriteLine($"構文解析エラー ({ast.Error.Column}, {ast.Error.Line}): {ast.Error.Message}");
                Console.ReadLine();
            }
            var prc = new KecaknoahPrecompiler();
            var src = prc.PrecompileAll(ast);

            var environment = new KecaknoahEnvironment();
            var module = environment.CreateModule("Main");
            module.RegisterSource(src);
            var ctx = module.CreateContext();
            var il = module["main"];
            var kargs = new List<KecaknoahString>();
            if (args.Length > 2)
            {
                kargs.AddRange(args.Skip(1).Select(p => p.AsKecaknoahString()));
            }
            if (il != KecaknoahNil.Instance) ctx.Execute(il, kargs.ToArray());
            /*
            var sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < 10; i++)
            {
                ctx.Execute(il);
            }
            sw.Stop();
            Console.WriteLine($"{sw.ElapsedMilliseconds}");
            */
            var asm = AssembleSource(src);
            File.WriteAllLines(args[0] + ".asm", asm);
            Console.ReadLine();
        }
コード例 #2
0
ファイル: KecaknoahModule.cs プロジェクト: akouryy/Kecaknoah
 private void ProcessUseDirective(KecaknoahSource src)
 {
     var cur = Directory.GetCurrentDirectory();
     var asm = Path.GetDirectoryName(typeof(KecaknoahModule).Assembly.Location);
     var lex = new KecaknoahLexer();
     var par = new KecaknoahParser();
     var prc = new KecaknoahPrecompiler();
     foreach (var text in src.Uses)
     {
         var arg = text.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
         switch (arg[0])
         {
             case "import":
                 var it = Path.Combine(cur, arg[1]);
                 Directory.SetCurrentDirectory(Path.GetDirectoryName(it));
                 var s = prc.PrecompileAll(par.Parse(lex.AnalyzeFromFile(it)));
                 RegisterSource(s);
                 Directory.SetCurrentDirectory(cur);
                 break;
             case "stdlib":
                 var lt = Path.Combine(asm, "lib");
                 Directory.SetCurrentDirectory(Path.GetDirectoryName(lt));
                 var s2 = prc.PrecompileAll(par.Parse(lex.AnalyzeFromFile(lt)));
                 RegisterSource(s2);
                 Directory.SetCurrentDirectory(cur);
                 break;
         }
     }
 }
コード例 #3
0
ファイル: Program.cs プロジェクト: akouryy/Kecaknoah
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.WriteLine("Usage: kecaknoah <input file>");
                return;
            }

            KecaknoahSource src;
            if (Path.GetExtension(args[0]).Equals(".kcb", StringComparison.OrdinalIgnoreCase))
            {
                src = KecaknoahBytecode.Load(File.OpenRead(args[0]));
            }
            else
            {
                var txt = File.ReadAllText(args[0]);
                var lexer = new KecaknoahLexer();
                var parser = new KecaknoahParser();
                var lr = lexer.AnalyzeFromSource(txt);
                if (!lr.Success)
                {
                    Console.WriteLine($"字句解析エラー ({lr.Error.Column}, {lr.Error.Line}): {lr.Error.Message}");
                    Console.ReadLine();
                    Environment.Exit(1);
                }
                var ast = parser.Parse(lr);
                if (!ast.Success)
                {
                    Console.WriteLine($"構文解析エラー ({ast.Error.Column}, {ast.Error.Line}): {ast.Error.Message}");
                    Console.ReadLine();
                    Environment.Exit(1);
                }
                var prc = new KecaknoahPrecompiler();
                src = prc.PrecompileAll(ast);
#if DEBUG
                KecaknoahBytecode.Save(src, File.OpenWrite(args[0] + ".kcb"));
#endif
            }
#if DEBUG
            var asm = AssembleSource(src);
            File.WriteAllLines(args[0] + ".kca", asm);
            Console.WriteLine("Assembled source was generated.");
            Console.ReadLine();
#endif
            var environment = new KecaknoahEnvironment();
            var module = environment.CreateModule("Main");
            module.RegisterStandardLibraries();
            module.RegisterSource(src);
            var ctx = module.CreateContext();
            var il = module["main"];
            var kargs = new List<KecaknoahObject>();
            if (args.Length >= 2)
            {
                kargs.Add(new KecaknoahArray(args.Skip(1).Select(p => p.AsKecaknoahString())));
            }
            else
            {
                kargs.Add(new KecaknoahArray(new List<KecaknoahObject>()));
            }
            if (il != KecaknoahNil.Instance)
            {
                ctx.Initialize(il, kargs);
                while (ctx.MoveNext()) ;
            }
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: akouryy/Kecaknoah
        static void Main(string[] args)
        {
            var lexer = new KecaknoahLexer();
            var parser = new KecaknoahParser();
            var precompiler = new KecaknoahPrecompiler();
            var environment = new KecaknoahEnvironment();
            var sw = new Stopwatch();
            var module = environment.CreateModule("Himanoa");
            module.RegisterStandardLibraries();
            var ctx = module.CreateContext();
            lexer.DefaultSourceName = "himanoa";
            var input = "";
            //var il = "";
            do
            {
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write("himanoa > ");
                input = Console.ReadLine();
                /*
                il = "";
                input = "";
                do
                {
                    il += input + Environment.NewLine;
                    input = Console.ReadLine();
                } while (input != "---");
                */
                //var ret = lexer.AnalyzeFromSource(il);
                var ret = lexer.AnalyzeFromSource(input);
                if (ret.Success)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("字句解析結果--------------------");
                    Console.WriteLine(string.Join(", ", ret.Tokens.Select(p => $"{{{p.TokenString}}}")));
                    var ast = parser.ParseAsExpression(ret);
                    //var ast = parser.Parse(ret);
                    if (ast.Success)
                    {
                        Console.ForegroundColor = ConsoleColor.Cyan;
                        Console.WriteLine("抽象構文木----------------------");
                        foreach (var i in ast.RootNode.ToDebugStringList()) Console.WriteLine(i);

                        var il = precompiler.PrecompileExpression(ast);

                        Console.ForegroundColor = ConsoleColor.Magenta;
                        Console.WriteLine("KecaknoahIL---------------------");
                        foreach (var i in il.Codes) Console.WriteLine(i.ToString());

                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine("実行結果------------------------");
                        try
                        {
                            var sf = ctx.ExecuteExpressionIL(il);
                            Console.WriteLine(sf.ToString());
                        }
                        catch (Exception e)
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("実行時エラー");
                            Console.WriteLine($"{e.GetType().Name}: {e.Message}");
                        }
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine($"{ast.SourceName}({ast.Error.Column}, {ast.Error.Line})\n{ast.Error.Message}");
                    }
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("字句解析エラー");
                    Console.WriteLine($"{ret.SourceName}({ret.Error.Column}, {ret.Error.Line})\n{ret.Error.Message}");
                }
                Console.WriteLine();
            } while (input != "exit");
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: utgwkk/Kecaknoah
        static void Main(string[] args)
        {
            var lexer = new KecaknoahLexer();
            var parser = new KecaknoahParser();
            var precompiler = new KecaknoahPrecompiler();
            var environment = new KecaknoahEnvironment();
            var sw = new Stopwatch();
            var module = environment.CreateModule("Himanoa");
            var ctx = module.CreateContext();
            lexer.DefaultSourceName = "himanoa";
            var input = "";
            //var il = "";
            do
            {
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write("himanoa > ");
                input = Console.ReadLine();
                /*
                il = "";
                input = "";
                do
                {
                    il += input + Environment.NewLine;
                    input = Console.ReadLine();
                } while (input != "---");
                */
                //var ret = lexer.AnalyzeFromSource(il);
                var ret = lexer.AnalyzeFromSource(input);
                if (ret.Success)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("字句解析結果--------------------");
                    Console.WriteLine(string.Join(", ", ret.Tokens.Select(p => $"{{{p.TokenString}}}")));
                    var ast = parser.ParseAsExpression(ret);
                    //var ast = parser.Parse(ret);
                    if (ast.Success)
                    {
                        Console.ForegroundColor = ConsoleColor.Cyan;
                        Console.WriteLine("抽象構文木----------------------");
                        foreach (var i in ast.RootNode.ToDebugStringList()) Console.WriteLine(i);

                        var il = precompiler.PrecompileExpression(ast);

                        Console.ForegroundColor = ConsoleColor.Magenta;
                        Console.WriteLine("KecaknoahIL---------------------");
                        foreach (var i in il.Codes) Console.WriteLine(i.ToString());

                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine("実行結果------------------------");
                        try
                        {
                            var sf = ctx.ExecuteWithStackFrame(il);
                            Console.WriteLine(sf.ReturningObject);
                            /*
                            Console.ForegroundColor = ConsoleColor.DarkRed;
                            Console.WriteLine("環境情報------------------------");
                            foreach (var i in sf.Locals)
                            {
                                Console.WriteLine($"{i.Key} : {i.Value.RawObject.ToString()}");
                            }
                            sw.Reset();
                            sw.Start();
                            for (int i = 0; i < 1048576; i++)
                            {
                                var val = ctx.Execute(il);
                            }
                            sw.Stop();
                            Console.WriteLine($"{sw.ElapsedMilliseconds / 1048576.0 }ms/call");
                            */
                        }
                        catch (Exception e)
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("実行時エラー");
                            Console.WriteLine($"{nameof(e)}: {e.Message}");
                        }

                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine($"{ast.SourceName}({ast.Error.Column}, {ast.Error.Line})\n{ast.Error.Message}");
                    }
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("字句解析エラー");
                    Console.WriteLine($"{ret.SourceName}({ret.Error.Column}, {ret.Error.Line})\n{ret.Error.Message}");
                }
                Console.WriteLine();
            } while (input != "exit");
        }