using System.Text; namespace CompilerDesignIFlr1 { internal class GrammarReader { //词法分析解决 internal Dictionary KeyToken { get; set; } = []; //此法分析解决 internal Dictionary SymbolToken { get; set; } = []; //词法分析解决 internal Dictionary RegexToken { get; set; } = []; //语法分析解决 internal Dictionary RegularToken { get; set; } = []; internal GrammarReader(string grammarFilePath) { string fileContent = File.ReadAllText(grammarFilePath); var dict = fileContent.PartParser(); var tokenDict = dict["@tokens"].PartParser(); foreach (var (key, value) in tokenDict) { if (value[1] == '!' && value[2] != '=') KeyToken.Add(key, value.DeDoubleQuote().Substring(1)); else if (value.Contains('$')) RegexToken.Add(key, value.Replace("$", "").DeDoubleQuote()); else SymbolToken.Add(key, value.DeDoubleQuote()); } Console.WriteLine("Key:"); foreach (var (key, value) in KeyToken) Console.WriteLine($"{key}: {value}"); Console.WriteLine("Symbol:"); foreach (var (key, value) in SymbolToken) Console.WriteLine($"{key}: {value}"); Console.WriteLine("Regex:"); foreach (var (key, value) in RegexToken) Console.WriteLine($"{key}: {value}"); foreach (var (key, value) in dict) { if (key == "@tokens") continue; RegularToken.Add(key, value); Console.WriteLine(key + ": " + value); } } } file static class StringExtension { internal static Dictionary PartParser(this string input) { Dictionary result = []; input = input.Replace("\n", " ").Replace("\r", " "); int start = 0; int layer = 0; string key = ""; string value = ""; bool inQuote = false; for (int i = 0; i < input.Length; i++) { char c = input[i]; switch (c) { case '"': inQuote = !inQuote; break; case '{': if (inQuote) break; if (layer++ == 0) { key = input.Substring(start, i - start); start = i + 1; } break; case '}': if (inQuote) break; if (layer-- == 1) { value = input.Substring(start, i - start); result.Add(key.Trim(), value.Trim()); start = i + 1; } break; } } return result; } internal static string DeDoubleQuote(this string s) { StringBuilder sb = new StringBuilder(); bool inLayer = false; for (int i = 0; i < s.Length; i++) { if (s[i] == '"') { if (!inLayer) { inLayer = true; } else { if (sb[^1] == '\\') { sb[^1] = '\"'; } else inLayer = false; } } else if (s[i] != ' ') sb.Append(s[i]); } return sb.ToString(); } } }