Ejemplo n.º 1
0
        private MultExpression parseMultExpression()
        {
            INode firstOperand = parseParamExpression();

            if (firstOperand != null)
            {
                MultExpression node = new MultExpression();
                node.Operands.Add(firstOperand);

                while (lexer.Token is AsteriskToken || lexer.Token is SlashToken)
                {
                    switch (lexer.Token)
                    {
                    case AsteriskToken _:
                        node.Operators.Add(AsteriskToken.Text);
                        break;

                    case SlashToken _:
                        node.Operators.Add(SlashToken.Text);
                        break;
                    }
                    lexer.NextToken();

                    node.Operands.Add(parseParamExpression());
                }

                return(node);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 2
0
        private AddExpression parseExpression()
        {
            MultExpression firstOperand = parseMultExpression();

            if (firstOperand != null)
            {
                AddExpression node = new AddExpression();
                node.Operands.Add(firstOperand);

                while (lexer.Token is PlusToken || lexer.Token is MinusToken)
                {
                    switch (lexer.Token)
                    {
                    case PlusToken _:
                        node.Operators.Add(PlusToken.Text);
                        break;

                    case MinusToken _:
                        node.Operators.Add(MinusToken.Text);
                        break;
                    }
                    lexer.NextToken();

                    node.Operands.Add(parseMultExpression());
                }

                return(node);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 3
0
        public void Visit(MultExpression multExpr)
        {
            int operandCntr = 1;

            multExpr.Operands[0].Accept(this);

            foreach (string oper in multExpr.Operators)
            {
                multExpr.Operands[operandCntr++].Accept(this);

                dynamic rightOper = Environment.PopFromTheStack();
                dynamic leftOper  = Environment.PopFromTheStack();

                if (rightOper.GetType() != leftOper.GetType())
                {
                    throw new ExecutorException("Cannot perform an arithmetic operation on operands of different types");
                }
                else if (leftOper is TurtleItem || leftOper is TurtleItem)
                {
                    throw new ExecutorException("Cannot perform an arithmetic operation on operands of type Turtle");
                }
                else if (rightOper is double && rightOper == 0)
                {
                    throw new ExecutorException("Dividing by 0");
                }
                else if (!(rightOper is double) && !(leftOper is double))
                {
                    throw new ExecutorException("Cannot apply multiplication operator on types different than num");
                }

                dynamic result = oper switch
                {
                    "*" => leftOper * rightOper,
                    "/" => leftOper / rightOper,
                    _ => throw new ExecutorException($"Unknown multiplicative operator {oper}")
                };

                Environment.PushToTheStack(result);
            }
        }
Ejemplo n.º 4
0
        public void Visit(MultExpression multExpr)
        {
            int operandCntr = 1;

            multExpr.Operands[0].Accept(this);

            foreach (string oper in multExpr.Operators)
            {
                switch (oper)
                {
                case "*":
                    Console.Write("*");
                    break;

                case "/":
                    Console.Write("/");
                    break;
                }

                multExpr.Operands[operandCntr++].Accept(this);
            }
        }