CompilerDesignIFLR1/CompilerDesignIflr1/GrammarReader.cs

125 lines
4.1 KiB
C#
Raw Normal View History

2024-12-23 01:42:58 +08:00
using System.Text;
2024-12-20 20:20:34 +08:00
namespace CompilerDesignIFlr1
{
internal class GrammarReader
{
2024-12-23 01:42:58 +08:00
//词法分析解决
internal Dictionary<string, string> KeyToken { get; set; } = [];
//此法分析解决
internal Dictionary<string, string> SymbolToken { get; set; } = [];
//词法分析解决
internal Dictionary<string, string> RegexToken { get; set; } = [];
//语法分析解决
internal Dictionary<string, string> 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<string, string> PartParser(this string input)
2024-12-20 20:20:34 +08:00
{
2024-12-23 01:42:58 +08:00
Dictionary<string, string> 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;
}
2024-12-20 20:20:34 +08:00
2024-12-23 01:42:58 +08:00
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();
2024-12-20 20:20:34 +08:00
}
}
}