Canon/Canon.Core/GrammarParser/Expression.cs

91 lines
2.0 KiB
C#
Raw Normal View History

2024-03-09 23:57:43 +08:00
namespace Canon.Core.GrammarParser;
/// <summary>
2024-03-10 11:22:19 +08:00
/// LR语法中的一个表达式例如 'program_struct -> ~program_head ; program_body'
/// 其中'~'标识当前移进到达的位置
2024-03-09 23:57:43 +08:00
/// </summary>
public class Expression : IEquatable<Expression>
{
2024-03-10 11:22:19 +08:00
/// <summary>
/// 表达式的左部
/// </summary>
2024-03-09 23:57:43 +08:00
public required NonTerminator Left { get; init; }
2024-03-10 11:22:19 +08:00
/// <summary>
/// 表达式的向前看字符串
/// </summary>
2024-03-09 23:57:43 +08:00
public required Terminator LookAhead { get; init; }
2024-03-10 11:22:19 +08:00
/// <summary>
/// 表达式的右部
/// </summary>
2024-03-09 23:57:43 +08:00
public required List<TerminatorBase> Right { get; init; }
2024-03-10 11:22:19 +08:00
/// <summary>
/// 当前移进的位置
/// </summary>
2024-03-09 23:57:43 +08:00
public int Pos { get; set; }
public bool Equals(Expression? other)
{
if (other is null)
{
return false;
}
if (Right.Count != other.Right.Count)
{
return false;
}
for (int i = 0; i < Right.Count; i++)
{
if (Right[i].IsTerminated != other.Right[i].IsTerminated)
{
return false;
}
if (!Right[i].Equals(other.Right[i]))
{
return false;
}
}
return Left == other.Left
&& LookAhead == other.LookAhead;
}
public override bool Equals(object? obj)
{
if (obj is not Expression other)
{
return false;
}
return Equals(other);
}
public override int GetHashCode()
{
int hash = Left.GetHashCode();
hash ^= LookAhead.GetHashCode();
foreach (TerminatorBase terminator in Right)
{
hash ^= terminator.GetHashCode();
}
return hash;
}
public static bool operator ==(Expression a, Expression b)
{
return a.Equals(b);
}
public static bool operator !=(Expression a, Expression b)
{
return !a.Equals(b);
}
}