feat: 将LR分析表生成到代码中 (#27)

Reviewed-on: PostGuard/Canon#27
This commit is contained in:
2024-04-08 19:46:24 +08:00
parent 5e3ea6303e
commit 1690187c0a
14 changed files with 1125 additions and 22 deletions

View File

@@ -79,6 +79,8 @@ public class Grammar
private class Transformer : ITransformer
{
public string Name => string.Empty;
public IDictionary<TerminatorBase, ITransformer> ShiftTable { get; }
= new Dictionary<TerminatorBase, ITransformer>();

View File

@@ -6,6 +6,13 @@ namespace Canon.Core.GrammarParser;
public abstract class TerminatorBase
{
public abstract bool IsTerminated { get; }
/// <summary>
/// 生成能产生该符号的C#代码
/// 用于预生成分析表
/// </summary>
/// <returns>产生该符号的C#代码</returns>
public abstract string GenerateCode();
}
/// <summary>
@@ -45,6 +52,29 @@ public class Terminator : TerminatorBase, IEquatable<Terminator>
_terminatorType = type;
}
public override string GenerateCode()
{
switch (_terminatorType)
{
case SemanticTokenType.Keyword:
return $"new Terminator(KeywordType.{_keywordType})";
case SemanticTokenType.Delimiter:
return $"new Terminator(DelimiterType.{_delimiterType})";
case SemanticTokenType.Operator:
return $"new Terminator(OperatorType.{_operatorType})";
case SemanticTokenType.Identifier:
return "Terminator.IdentifierTerminator";
case SemanticTokenType.Character:
return "Terminator.CharacterTerminator";
case SemanticTokenType.Number:
return "Terminator.NumberTerminator";
case SemanticTokenType.End:
return "Terminator.EndTerminator";
}
throw new InvalidOperationException();
}
/// <summary>
/// 标识符终结符单例
/// 鉴于在语法中不关心标识符具体内容,因此可以使用单例对象
@@ -205,6 +235,11 @@ public class NonTerminator(NonTerminatorType type) : TerminatorBase, IEquatable<
return Type.GetHashCode();
}
public override string GenerateCode()
{
return $"new NonTerminator(NonTerminatorType.{Type})";
}
public override string ToString() => Type.ToString();
public bool Equals(NonTerminator? other)