Я новичок в шаблонах проектирования и пытаюсь построить дерево, используя составной шаблон, чтобы представить арифметическое выражение, и у меня есть следующие грамматические правила:
"expression"::= "simple expression" |"complex expression"
"simple expression"::= "constant" | "variable"
"constant"::=("number")
"variable"::=("name")
"complex expression" ::=("sign" "operation symbol" "expression")
"operation symbol"::=+| -|*|/
Я написалкод на C # ниже: я строю дерево в методе Main и показываю выражение рекурсивным методом Display.Это правильный способ решить эту проблему или есть другой путь?
class Program
{
static void Main(string[] args)
{
Expression root = new ComplexExpression("root");
root.Add(new Variable("35a"));
root.Add(new OpSymbol("+"));
var x = new ComplexExpression("subRoot 1 level");
x.Add(new Constant("1488"));
x.Add(new OpSymbol("-"));
x.Add(new Constant("2"));
root.Add(x);
root.Display();
}
}
//Component our
abstract class Expression
{
protected string name;
public Expression(string name)
{
this.name = name;
}
public abstract void Display();
public abstract void Add(Expression e);
public abstract void Remove(Expression e);
}
class SimpleExpression : Expression
{
List<Expression> components = new List<Expression>();
public SimpleExpression(string value) : base(value)
{
this.name = value;
}
public override void Add(Expression e)
{
components.Add(e);
}
public override void Remove(Expression e)
{
components.Remove(e);
}
public override void Display()
{
Console.Write($"{name} ");
foreach (var node in components)
{
node.Display();
}
}
}
class ComplexExpression : Expression
{
List<Expression> components = new List<Expression>();
public ComplexExpression(string name) : base(name)
{
}
public override void Display()
{
Console.Write($"(");
foreach (var node in components)
{
node.Display();
}
Console.Write(")");
}
public override void Add(Expression e)
{
components.Add(e);
}
public override void Remove(Expression e)
{
components.Remove(e);
}
}
class OpSymbol : Expression
{
public string symbol { get; private set; }
public OpSymbol(string symbol) : base(symbol)
{
this.symbol = symbol;
}
public override void Display()
{
Console.Write(this.symbol);
}
public override void Add(Expression e)
{
try
{
throw new NotImplementedException();
}
catch (Exception exception)
{
Console.WriteLine("ACCESS DENIED");
}
}
public override void Remove(Expression e)
{
try
{
throw new NotImplementedException();
}
catch (Exception exception)
{
Console.WriteLine("ACCESS DENIED");
}
}
}
class Sign : Expression
{
private string name;
public Sign(string name) : base(name)
{
this.name = name;
}
public override void Display() {}
public override void Add(Expression e)
{
try
{
throw new NotImplementedException();
}
catch (Exception exception)
{
Console.WriteLine("ACCESS DENIED");
}
}
public override void Remove(Expression e)
{
try
{
throw new NotImplementedException();
}
catch (Exception exception)
{
Console.WriteLine("ACCESS DENIED");
}
}
}
class Constant : SimpleExpression
{
List<Expression> expression = new List<Expression>();
public string Number { get; set; }
public Constant(string name) : base(name)
{
this.Number = name;
}
}
//leaf
class Variable : SimpleExpression
{
public string Value { get; set; }
public Variable(string value) : base(value)
{
this.Value = value;
}
}