Esempio n. 1
0
        private static void BuildCC()
        {
            var projectDir = DirRef.ProjectDir();
            var linguCC    = projectDir.Up.Dir("LinguCC");
            var genDir     = linguCC.Dir("Gen");

            Environment.CurrentDirectory = genDir;

            var file  = FileRef.From("./Lingu.Grammar");
            var dumps = FileRef.From("./Lingu").Add(".Out");

            var context = Timer.Time("context", () => new LinguContext());

            var source = Timer.Time("source", () => Source.FromFile(file));

            var lexer = Timer.Time("lexer", () => new Lexer(context, source));

            var parser = Timer.Time("parser", () => new Parser(context, lexer));

            var parseTree = Timer.Time("parse", () => parser.Parse());

            Timer.Time("tree-dump", () => new TreeDumper(dumps.Add(".Tree")).Dump(parseTree));

            var ast = Timer.Time("ast", () => new TreeBuilder().Visit(parseTree));

            var grammar = Timer.Time("build", () => new GrammarBuilder(ast).Build());

            Timer.Time("dump", () => new Dumper(grammar).Dump(dumps));

            Timer.Time("write", () => new CSharpWriter(grammar, file, genDir).Write());
        }
Esempio n. 2
0
 public Package(CompileContext context, DirRef packageDir, string name, Package?builtin = null)
 {
     Context    = context;
     PackageDir = packageDir;
     Name       = name;
     Builtin    = builtin;
 }
Esempio n. 3
0
        public void Build()
        {
            var lingu = new LinguContext();

            var projectDir = DirRef.ProjectDir();
            var ponyDir    = projectDir.Dir("Ponies");

            Environment.CurrentDirectory = ponyDir;

            var file  = FileRef.From("./Pony.Grammar");
            var dumps = FileRef.From("./Pony").Add(".Out");

            var source = Source.FromFile(file);

            var parseTree = lingu.Try(source);

            if (parseTree != null)
            {
                new TreeDumper(dumps.Add(".Tree")).Dump(parseTree);

                var ast = new TreeBuilder().Visit(parseTree);

                if (ast != null)
                {
                    var grammar = new GrammarBuilder(ast).Build();

                    if (grammar != null)
                    {
                        new Dumper(grammar).Dump(dumps);

                        new CSharpWriter(grammar, file, ponyDir).Write();
                    }
                }
            }
        }
Esempio n. 4
0
        internal static void AquireData(DirRef ucdDir)
        {
            using (var client = new WebClient())
            {
                foreach (var fileName in unicodeFiles)
                {
                    var localFile = ucdDir.File(fileName);
                    var tmpFile   = ucdDir.File(fileName).Add(".tmp");

                    if (!localFile.OnPladde)
                    {
                        Console.WriteLine($"download {localFile.FileName}");

                        client.DownloadFile(@"https://www.unicode.org/Public/12.1.0/ucd/" + fileName, tmpFile);

                        if (localFile.OnPladde)
                        {
                            File.Delete(localFile);
                        }

                        Console.WriteLine($"extract {localFile.FileName}");

                        ZipFile.ExtractToDirectory(tmpFile, ucdDir, true);

                        File.Move(tmpFile, localFile);
                    }
                }
            }
        }
Esempio n. 5
0
        private static void RamboBuild(string grammarFilename, string testFilename)
        {
            var projectDir = DirRef.ProjectDir();
            var grammarDir = projectDir.Dir("Grammars");
            var debugDir   = projectDir.Dir("DebugOut");

            var grammarFile = grammarDir.File(grammarFilename);
            var testFile    = grammarDir.File(testFilename);

            Environment.CurrentDirectory = debugDir;

            try
            {
                var outFile = debugDir.File(grammarFile.FileName);

                var parser = Parse(grammarFile, outFile, false, LipegParser.From(), root => new GrammarBuilder().Build(root));

                for (var i = 0; i < 1; ++i)
                {
                    Debug.Assert(parser != null);

                    outFile = outFile.Add(".boot");

                    parser = Timer.Time("p-a-p", () => Parse(testFile, outFile, true, parser, Builder.BuildAst));
                }
            }
            catch (MessageException e)
            {
                var results = new CompileResult();
                results.AddError(e.Msg);
                results.Report(Console.Out);
            }
        }
Esempio n. 6
0
 public CSharpContext(Grammar grammar, FileRef sourceFile, string @namespace, DirRef output, CsWriter writer = null)
 {
     Grammar    = grammar;
     SourceFile = sourceFile;
     Namespace  = @namespace;
     Output     = output;
     Writer     = writer;
 }
Esempio n. 7
0
        static void Main(string[] args)
        {
            var runner = new Runner();

            var thisProject = DirRef.ProjectDir();
            var temp        = thisProject.Up.Up.Dir("Temp");

            if (!temp.Exists)
            {
                throw new InvalidOperationException();
            }

            Environment.CurrentDirectory = temp;

            var jsonTestSuite = "JSONTestSuite";

            if (!temp.Dir(jsonTestSuite).Dir(".git").Exists)
            {
                runner.Run("git", "git", "clone https://github.com/nst/JSONTestSuite.git --progress");
                Environment.CurrentDirectory = temp.Dir(jsonTestSuite);
            }
            else
            {
                Environment.CurrentDirectory = temp.Dir("JSONTestSuite");
                runner.Run("git", "git", "pull --progress");
            }

            var cases = temp.Dir(jsonTestSuite).Dir("test_parsing");

            foreach (var testCase in cases.Files())
            {
                if (testCase.FileName.StartsWith("i_"))
                {
                    Test(testCase, LinParse.JsonCheck.Outcome.Indifferent);
                }
                if (testCase.FileName.StartsWith("n_"))
                {
                    Test(testCase, LinParse.JsonCheck.Outcome.Fail);
                }
                if (testCase.FileName.StartsWith("y_"))
                {
                    Test(testCase, LinParse.JsonCheck.Outcome.Succeed);
                }
            }

            void Test(FileRef testCase, LinParse.JsonCheck.Outcome outcome)
            {
                Console.Write($"{testCase.FileName}");
                var ok         = LinParse.JsonCheck.Run(testCase, outcome);
                var indication = ok ? "OK" : "FAIL";

                Console.WriteLine($"\r{indication} {testCase.FileName}");
            }

            Console.Write("(almost) any key ... ");
            Console.ReadKey(true);
        }
Esempio n. 8
0
        public Package PreparePackage(DirRef packageDir, string name, bool isBuiltin = false)
        {
            var builtin = isBuiltin ? null : UsePackage(Builtin);

            var package = new Package(Context, packageDir, name, builtin);

            Load(package);

            LoadClosure();

            return(package);
        }
Esempio n. 9
0
        private static void Demo()
        {
            var projectDir = DirRef.ProjectDir();
            var debugDir   = projectDir.Dir("out");

            Environment.CurrentDirectory = debugDir;

            var grammarFile = projectDir.Dir("..").Dir("Lipeg.Boot").Dir("Grammars").File("lipeg.lpg");

            var sourceContent = grammarFile.GetContent();

            var source = Source.FromString("demo", sourceContent);
        }
Esempio n. 10
0
        private void BuildTree(string stem, string content)
        {
            Environment.CurrentDirectory = DirRef.ProjectDir().Dir("Grammar");

            var grammarSource = FileRef.From($"./{stem}.Grammar");

            var dests = FileRef.From(grammarSource.Directory + "/Out/" + grammarSource.BaseName).With(".Out");

            var raw = Parser.Parse(grammarSource);

            if (raw != null)
            {
                var builder = new Build.GrammarBuilder(raw);

                var grammar = builder.Build();
                new Dumper(grammar).Dump(dests);

                var ccOut = DirRef.ProjectDir().Dir("..").Dir("Lingu.CC").Dir("Gen");

                var csharp = new CSharpWriter(grammar, grammarSource, ccOut);
                csharp.Write();

                Debug.Assert(grammar.Eof != null);

                var dfaSet = new CompactDfaReader(new BinReader(new CompactDfaWriter(grammar).Write())).Read();

                //var dfaSet = new DfaSet(grammar.Dfas.Select(dfa => dfa.Convert()).ToArray(), grammar.StateToDfa, grammar.SpacingDfa.Convert());

                var context = new LinguContext(
                    grammar.Symbols,
                    grammar.Productions,
                    grammar.ParseTable,
                    dfaSet);

                Source source;

                if (File.Exists(content))
                {
                    source = Source.FromFile(content);
                }
                else
                {
                    source = Source.FromString(content);
                }

                var tree = context.Try(source);

                new TreeDumper(dests.Add(".Tree")).Dump(tree);
            }
        }
Esempio n. 11
0
        private static void Demo()
        {
            var projectDir = DirRef.ProjectDir();
            var debugDir   = projectDir.Dir("out");

            Environment.CurrentDirectory = debugDir;

            var grammarFile = projectDir.Dir("..").Dir("Lipeg.Boot").Dir("Grammars").File("lipeg.lpg");

            var sourceContent = grammarFile.GetContent();

            var source  = Source.FromString("demo", sourceContent);
            var current = source.Start();

            var parser = new LipegParser();
            var result = Timer.Time("parse", () => parser.Parse(current));

            if (!result.IsSuccess || !result.Next.AtEnd)
            {
                Console.WriteLine("ERROR");
                return;
            }

            var loop = 5;

            var sum = TimeSpan.Zero;

            for (var i = 0; i < loop; ++i)
            {
                result = Timer.Time("parse", ref sum, () => parser.Parse(current));
            }
            Console.WriteLine($"Ø parse: {sum / loop}");

            Dumper.Nodes(debugDir.File("nodes"), result.Nodes);

            var ast = Timer.Time("aster", () => SDK.Checkers.Builder.BuildAst(result.Nodes[0]));

            sum = TimeSpan.Zero;
            for (var i = 0; i < loop; ++i)
            {
                ast = Timer.Time("aster", ref sum, () => SDK.Checkers.Builder.BuildAst(result.Nodes[0]));
            }
            Console.WriteLine($"Ø aster: {sum / loop}");

            Dumper.Pretty(debugDir.File("ast"), ast);
        }
Esempio n. 12
0
        internal static void Main()
        {
            var projectDir = DirRef.ProjectDir();
            var dataDir    = projectDir.Dir("Data");
            var ucdDir     = dataDir.Dir("ucd");

            AquireData(ucdDir);

            var blocksFile = ucdDir.File("Blocks.txt");

            new UcdBlocksParser().Parse(blocksFile);

            var scriptsFile = ucdDir.File("Scripts.txt");

            new UcdScriptsParser().Parse(scriptsFile);

            Console.Write("press (almost) any key ... ");
            Console.ReadKey(true);
        }
Esempio n. 13
0
        public static void Ensure(string url, DirRef repository)
        {
            var runner = new Runner();

            var cd = Environment.CurrentDirectory;

            if (repository.Dir(".git").Exists)
            {
                Environment.CurrentDirectory = repository;

                runner.Run("git", "git", "pull --progress");
            }
            else
            {
                Environment.CurrentDirectory = repository.Up;

                runner.Run("git", "git", $"clone {url} --progress");
            }

            Environment.CurrentDirectory = cd;
        }
Esempio n. 14
0
        private void MakePackage(DirRef packageDir)
        {
            var units = new List <Tree.Unit>();

            foreach (var unitFile in EnumerateJokes(packageDir).Skip(0))
            {
                var name = "pack:" + unitFile.ToString().Substring(PackagesDir.ToString().Length + 1);

                Console.WriteLine($"{name}");
                var(errors, unit) = Compile(unitFile, name);
                if (!errors.NoError() || unit == null)
                {
                    errors.Describe(Console.Out);
                    return;
                }
                units.Add(unit);
            }

            var package = new Package(null, units);

            package.Build();

            foreach (var unit in package.Units)
            {
                foreach (var unitMember in unit.Members)
                {
                    Console.WriteLine($"{unitMember.Name}");
                    foreach (var classMember in unitMember.Items)
                    {
                        Console.WriteLine($"  {classMember}");
                    }
                }
            }

            package.Errors.Describe(Console.Out);
        }
Esempio n. 15
0
        public void Build(string name)
        {
            var lingu = new LinguContext();

            var projectDir = DirRef.ProjectDir();
            var ucdDir     = projectDir.Up.Dir("LinguUcd");

            Environment.CurrentDirectory = ucdDir;

            var sourceFile = ucdDir.File($"{name}.lug");
            var outputDir  = ucdDir.Dir("Generated");
            var dumps      = outputDir.File($"{name}.Out");

            var source = Source.FromFile(sourceFile);

            var parseTree = lingu.Try(source);

            if (parseTree != null)
            {
                new TreeDumper(dumps.Add(".Tree")).Dump(parseTree);

                var ast = new TreeBuilder().Visit(parseTree);

                if (ast != null)
                {
                    var grammar = new GrammarBuilder(ast).Build();

                    if (grammar != null)
                    {
                        new Dumper(grammar).Dump(dumps);

                        new CSharpWriter(grammar, sourceFile, outputDir).Write();
                    }
                }
            }
        }
Esempio n. 16
0
        private void BuildCC0()
        {
            var projectDir = DirRef.ProjectDir();
            var cc0        = projectDir.Dir("..").Dir("LinguCC0");
            var genDir     = cc0.Dir("Gen");

            Environment.CurrentDirectory = genDir;

            var grammarSource = FileRef.From($"./Lingu.Grammar");
            var outs          = FileRef.From("./Lingu").Add(".Out");

            var raw = Parser.Parse(grammarSource);

            if (raw != null)
            {
                var builder = new GrammarBuilder(raw);

                var grammar = builder.Build();
                new Dumper(grammar).Dump(outs);

                var csharp = new CSharpWriter(grammar, grammarSource, genDir);
                csharp.Write();
            }
        }
Esempio n. 17
0
 public CSharpWriter(Grammar grammar, FileRef sourceFile, DirRef output)
     : base(new CSharpContext(grammar, sourceFile, "Lingu.CC", output))
 {
 }
Esempio n. 18
0
 public CompileContext(Errors errors, DirRef packagesDir)
 {
     Errors      = errors;
     PackagesDir = packagesDir;
     Logger      = new IndentWriter(Console.Out, " .. ");
 }
Esempio n. 19
0
        private static void EnsureSources()
        {
            var thisProject = DirRef.ProjectDir();
            var temp        = thisProject.Up.Up.Dir("Temp");

            if (!temp.Exists)
            {
                throw new InvalidOperationException();
            }

            var repository = temp.Dir("JSONTestSuite");

            GitRunner.Ensure("https://github.com/nst/JSONTestSuite.git", repository);

            repository = temp.Dir("ponyc");
            GitRunner.Ensure("https://github.com/ponylang/ponyc.git", repository);

            repository = temp.Dir("pony-source");
            repository.Ensure();

            string[] sources = new string[]
            {
                "https://github.com/ponylang/ponyup.git",
                "https://github.com/ponylang/corral.git",
                "https://github.com/ponylang/pony-stable.git",
                "https://github.com/ponylang/appdirs.git",
                "https://github.com/ponylang/net_ssl.git",
                "https://github.com/ponylang/http.git",
                "https://github.com/ponylang/reactive-streams.git",
                "https://github.com/WallarooLabs/pony-kafka.git",
                "https://github.com/dougmacdoug/ponylang-linal.git",
                "https://github.com/WallarooLabs/wallaroo.git",
                "https://github.com/jemc/pony-zmq.git",
                "https://github.com/Theodus/jennet.git",
                "https://github.com/jtfmumm/novitiate.git",
                "https://github.com/mfelsche/ponycheck.git",
                "https://github.com/jemc/jylis.git",
                "https://github.com/oraoto/pony-websocket.git",
                "https://github.com/jemc/ponycc.git",
                "https://github.com/jemc/pony-crdt.git",
                "https://github.com/SeanTAllen/pony-msgpack.git",
                "https://github.com/sylvanc/pony-lecture.git",
                "https://github.com/jemc/pony-sodium.git",
                "https://github.com/jemc/pony-capnp.git",
                "https://github.com/kulibali/kiuatan.git",
                "https://github.com/lisael/pony-postgres.git",
                "https://github.com/mfelsche/ponyfmt.git",
                "https://github.com/joncfoo/pony-sqlite.git",
                "https://github.com/autodidaddict/ponymud.git",
                "https://github.com/ponylang/changelog-tool.git",
                "https://github.com/jemc/pony-pegasus.git",
                "https://github.com/jemc/pony-llvm.git",
                "https://github.com/krig/tinyhorse.git",
                "https://github.com/sylvanc/peg.git",
                "https://github.com/EpicEric/pony-mqtt.git",
                "https://github.com/jemc/pony-rope.git",
                "https://github.com/BrianOtto/pony-gui.git",
                "https://github.com/jemc/pony-jason.git",
                "https://github.com/BrianOtto/pony-win32.git",
                "https://github.com/jkleiser/toy-forth-in-pony.git",
                "https://github.com/emilbayes/pony-endianness.git",
                "https://github.com/sgebbie/pony-graphs.git",
                "https://github.com/lisael/pied.git",
                "https://github.com/ponylang/regex.git",
                "https://github.com/mfelsche/pony-maybe.git",
                "https://github.com/sgebbie/pony-statsd.git",
                "https://github.com/jemc/pony-unsafe.git",
                "https://github.com/lisael/pony-bitarray.git",
                "https://github.com/lisael/pony-bm.git",
                "https://github.com/slayful/sagittarius.git",
                "https://github.com/ponylang/glob.git",
                "https://github.com/jtfmumm/pony-logic.git",
                "https://github.com/sgebbie/pony-tty.git",
                "https://github.com/jtfmumm/pony-queue.git",
                "https://github.com/mfelsche/pony-kv.git",
                "https://github.com/elmattic/pony-toml.git",
                "https://github.com/krig/pony-sform.git",
                "https://github.com/jemc/pony-dict.git",
                "https://github.com/cquinn/ponycli.git",
                "https://github.com/niclash/pink2web.git",
                "https://github.com/andrenth/pony-uuid.git",
                "https://github.com/kulibali/kiuatan-calculator.git",
                "https://github.com/Theodus/pony-stats.git",
                "https://github.com/jtfmumm/microkanren-pony.git",
                "https://github.com/ergl/sss.git",
                "https://github.com/SeanTAllen/lori.git",
            };

            foreach (var url in sources)
            {
                var name = Path.GetFileNameWithoutExtension(url);
                GitRunner.Ensure(url, repository.Dir(name));
            }
        }