Построение дерева с использованием шаблона Composite - PullRequest
0 голосов
/ 13 октября 2018

Я новичок в шаблонах проектирования и пытаюсь построить дерево, используя составной шаблон, чтобы представить арифметическое выражение, и у меня есть следующие грамматические правила:

"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;
        }
    } 
...