luaaaaah/Program.cs

95 lines
1.8 KiB
C#

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<string, string> failedFiles = [];
public static void Test(string directory)
{
TestRecursive(directory);
Console.WriteLine("===FAILED===");
foreach(KeyValuePair<string, string> 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);
}
}
}