@@ -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>();
|
||||
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user