Ejemplo n.º 1
0
        public void Visit(EqualCondition equalCond)
        {
            int operandCntr = 1;

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

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

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

                if (rightOper.GetType() != leftOper.GetType())
                {
                    throw new ExecutorException("Cannot perform relational condition on operands different than double");
                }
                else if (leftOper is TurtleItem || leftOper is TurtleItem)
                {
                    throw new ExecutorException("Cannot perform an arithmetic operation on operands of type Turtle");
                }

                dynamic result = oper switch
                {
                    "==" => leftOper == rightOper ? true : false,
                    "!=" => leftOper == rightOper ? false : true,
                    _ => null,
                };

                Environment.PushToTheStack(result);
            }
        }
Ejemplo n.º 2
0
        private EqualCondition parseCondition()
        {
            RelationalCondition firstOperand = parseRelationalCondition();

            if (firstOperand != null)
            {
                EqualCondition equalCondition = new EqualCondition();
                equalCondition.Operands.Add(firstOperand);

                while (lexer.Token is EqualToken || lexer.Token is NotEqualToken)
                {
                    switch (lexer.Token)
                    {
                    case EqualToken _:
                        equalCondition.Operators.Add(EqualToken.Text);
                        break;

                    case NotEqualToken _:
                        equalCondition.Operators.Add(NotEqualToken.Text);
                        break;
                    }
                    lexer.NextToken();

                    equalCondition.Operands.Add(parseRelationalCondition());
                }

                return(equalCondition);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 3
0
        private INode parseIf()
        {
            if (lexer.Token is IfToken)
            {
                lexer.NextToken();

                accept(typeof(LRoundBracketToken));

                EqualCondition condition = parseCondition()
                                           ?? throw new ParserException("Expected condition in " + lexer.Token.Position);

                accept(typeof(RRoundBracketToken));

                BlockStatement body = parseBlockStatement();

                if (lexer.Token is ElseToken)
                {
                    lexer.NextToken();

                    BlockStatement elseBody = parseBlockStatement();

                    return(new IfStatement(condition, body, elseBody));
                }

                return(new IfStatement(condition, body, new BlockStatement()));
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 4
0
        public void Visit(EqualCondition equalCond)
        {
            int operandCntr = 1;

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

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

                case "!=":
                    Console.Write("!=");
                    break;
                }

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