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
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|