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()); }
public Package(CompileContext context, DirRef packageDir, string name, Package?builtin = null) { Context = context; PackageDir = packageDir; Name = name; Builtin = builtin; }
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(); } } } }
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); } } } }
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); } }
public CSharpContext(Grammar grammar, FileRef sourceFile, string @namespace, DirRef output, CsWriter writer = null) { Grammar = grammar; SourceFile = sourceFile; Namespace = @namespace; Output = output; Writer = writer; }
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); }
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); }
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); }
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); } }
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); }
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); }
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; }
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); }
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(); } } } }
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(); } }
public CSharpWriter(Grammar grammar, FileRef sourceFile, DirRef output) : base(new CSharpContext(grammar, sourceFile, "Lingu.CC", output)) { }
public CompileContext(Errors errors, DirRef packagesDir) { Errors = errors; PackagesDir = packagesDir; Logger = new IndentWriter(Console.Out, " .. "); }
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)); } }