using System; using System.Collections.Generic; using System.IO; using System.Text.Json; namespace luaaaaah; public class Program { internal static JsonSerializerOptions options = new() { IncludeFields = true, WriteIndented = true, }; public static void Main(string[] args) { switch(args[0]) { case "test": { Test(args[1]); } break; case "run": { Run(args[1], true); } break; } } public static void Run(string file, bool debug) { string content = File.ReadAllText(file).ReplaceLineEndings(); Token[] tokens = new Tokenizer().Tokenize(content); if(debug) { foreach(Token token in tokens) { Console.WriteLine($"{token.region}: {token.type} {{{token.data}}}"); } } if(tokens.Length == 0) { return; } if(Path.GetFileName(file).StartsWith("tokenizer")) { Console.WriteLine($"Skipping parsing of `{file}`"); } else { Parser.ChunkNode root = new Parser().Parse(tokens); if(debug) { Console.WriteLine("Parsed tree:"); Console.WriteLine(JsonSerializer.Serialize(root, options: options)); } } } static readonly Dictionary failedFiles = []; public static void Test(string directory) { TestRecursive(directory); Console.WriteLine("===FAILED==="); foreach(KeyValuePair entry in failedFiles) { Console.WriteLine($"{entry.Key}: {entry.Value}"); } Console.WriteLine($"==={failedFiles.Count}==="); } public static void TestRecursive(string directory) { foreach(string file in Directory.EnumerateFiles(directory)) { if(file.EndsWith(".lua")) { try { Run(file, false); } catch(Exception e) { Console.WriteLine($"{file}: {e}"); failedFiles.Add(file, e.ToString()); } } } foreach(string dir in Directory.EnumerateDirectories(directory)) { TestRecursive(dir); } } }