using Canon.Core.GrammarParser; namespace Canon.Core.LexicalParser; using Enums; /// /// 词法记号基类 /// public abstract class SemanticToken : IEquatable { public abstract SemanticTokenType TokenType { get; } /// /// 记号出现的行号 /// public required uint LinePos { get; init; } /// /// 记号出现的列号 /// public required uint CharacterPos { get; init; } /// /// 记号的字面值 /// public required string LiteralValue { get; init; } public static implicit operator Terminator(SemanticToken token) { switch (token.TokenType) { case SemanticTokenType.Character: return Terminator.CharacterTerminator; case SemanticTokenType.Identifier: return Terminator.IdentifierTerminator; case SemanticTokenType.Number: return Terminator.NumberTerminator; case SemanticTokenType.End: return Terminator.EndTerminator; case SemanticTokenType.Delimiter: return new Terminator(((DelimiterSemanticToken)token).DelimiterType); case SemanticTokenType.Keyword: return new Terminator(((KeywordSemanticToken)token).KeywordType); case SemanticTokenType.Operator: return new Terminator(((OperatorSemanticToken)token).OperatorType); default: throw new ArgumentException("Unknown token type"); } } /// /// 栈底符号单例对象 /// public static EndSemanticToken End => new() { LinePos = uint.MaxValue, CharacterPos = uint.MaxValue, LiteralValue = string.Empty }; public override string ToString() { return $"LinePos: {LinePos}, CharacterPos: {CharacterPos}, LiteralValue: {LiteralValue}, TokenType: {TokenType}"; } public bool Equals(SemanticToken? other) { if (other == null) return false; return LinePos == other.LinePos && CharacterPos == other.CharacterPos && LiteralValue == other.LiteralValue && TokenType == other.TokenType; } public override bool Equals(object? obj) { return obj is SemanticToken semanticTokenObj && Equals(semanticTokenObj); } public override int GetHashCode() { return LinePos.GetHashCode() ^ CharacterPos.GetHashCode() ^ LiteralValue.GetHashCode() ^ TokenType.GetHashCode(); } } /// /// 字符类型记号 /// public class CharacterSemanticToken : SemanticToken { public override SemanticTokenType TokenType => SemanticTokenType.Character; } /// /// 分隔符类型记号 /// public class DelimiterSemanticToken : SemanticToken { public override SemanticTokenType TokenType => SemanticTokenType.Delimiter; public required DelimiterType DelimiterType { get; init; } public override int GetHashCode() { return base.GetHashCode() ^ DelimiterType.GetHashCode(); } } /// /// 关键字类型记号 /// public class KeywordSemanticToken : SemanticToken { public override SemanticTokenType TokenType => SemanticTokenType.Keyword; public required KeywordType KeywordType { get; init; } public override int GetHashCode() { return base.GetHashCode() ^ KeywordType.GetHashCode(); } } /// /// 操作数类型记号 /// public class OperatorSemanticToken : SemanticToken { public override SemanticTokenType TokenType => SemanticTokenType.Operator; public required OperatorType OperatorType { get; init; } public override int GetHashCode() { return base.GetHashCode() ^ OperatorType.GetHashCode(); } } /// /// 数值类型记号 /// public class NumberSemanticToken : SemanticToken { public override SemanticTokenType TokenType => SemanticTokenType.Number; public required NumberType NumberType { get; init; } public override int GetHashCode() { return base.GetHashCode() ^ NumberType.GetHashCode(); } } /// /// 标识符类型记号 /// public class IdentifierSemanticToken : SemanticToken { public override SemanticTokenType TokenType => SemanticTokenType.Identifier; /// /// 标识符名称 /// public string IdentifierName => LiteralValue.ToLower(); } /// /// 终结符记号 /// public class EndSemanticToken : SemanticToken { public override SemanticTokenType TokenType => SemanticTokenType.End; }