From cf7e621c104cb4aea801392585d2dcc9335bc013 Mon Sep 17 00:00:00 2001 From: Melodi <62381002+Melodi17@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:44:51 +1000 Subject: added preprocessor (wip) --- Compiler/Preprocessor.cs | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Compiler/Preprocessor.cs (limited to 'Compiler/Preprocessor.cs') diff --git a/Compiler/Preprocessor.cs b/Compiler/Preprocessor.cs new file mode 100644 index 0000000..01c14ab --- /dev/null +++ b/Compiler/Preprocessor.cs @@ -0,0 +1,59 @@ +namespace Q1.Compiler; + +using System.Text.RegularExpressions; + +public static class Preprocessor +{ + private static readonly Dictionary Defines = new(); + + public static string Process(string filePath) + { + List lines = []; + ProcessFile(filePath, lines, []); + return string.Join(Environment.NewLine, lines); + } + + private static void ProcessFile(string filePath, List output, HashSet includeGuard) + { + if (includeGuard.Contains(Path.GetFullPath(filePath))) + return; // prevent recursive includes + + includeGuard.Add(Path.GetFullPath(filePath)); + + foreach (string rawLine in File.ReadAllLines(filePath)) + { + string line = rawLine.Trim(); + + if (line.StartsWith("#include")) + { + // simple format: #include "file" + Match match = Regex.Match(line, "#include\\s+\"([^\"]+)\""); + if (match.Success) + { + string includePath = Path.Combine(Path.GetDirectoryName(filePath)!, match.Groups[1].Value); + ProcessFile(includePath, output, includeGuard); + } + continue; + } + else if (line.StartsWith("#define")) + { + // simple format: #define NAME VALUE + Match match = Regex.Match(line, "#define\\s+(\\w+)\\s+(.*)"); + if (match.Success) + Defines[match.Groups[1].Value] = match.Groups[2].Value; + continue; + } + else if (line.StartsWith("#load")) + { + output.Add(line.Replace("#load", "#.include")); + continue; + } + + // expand macros + foreach (KeyValuePair kvp in Defines) + line = line.Replace(kvp.Key, kvp.Value); + + output.Add(line); + } + } +} \ No newline at end of file -- cgit v1.3.1