Esempio n. 1
0
        public InterpreterResult Visit(ConditionCompositeNode node, Context context)
        {
            InterpreterResult result     = null;
            InterpreterResult leftResult = Visit(node.Left, context);

            if (leftResult.Error != null)
            {
                return(leftResult);
            }
            if (!(leftResult.Result is Binary))
            {
                return(new InterpreterResult(null, new RuntimeError($"Expected boolean expression", node.Left.Pos_Start, node.Left.Pos_End, context)));
            }

            Binary            left        = leftResult.Result;
            InterpreterResult rightResult = Visit(node.Right, context);

            if (rightResult.Error != null)
            {
                return(rightResult);
            }
            if (!(rightResult.Result is Binary))
            {
                return(new InterpreterResult(null, new RuntimeError($"Expected boolean expression", node.Right.Pos_Start, node.Right.Pos_End, context)));
            }

            Binary right = rightResult.Result;

            if (node.Op_tok.Matches(TokenType.KEYWORD, "and"))
            {
                result = left.Anded_To(right);
            }
            if (node.Op_tok.Matches(TokenType.KEYWORD, "or"))
            {
                result = left.Ored_To(right);
            }
            if (result.Error == null)
            {
                result.Result.SetPos(left.Start_pos, right.End_pos);
            }
            return(result);
        }
Esempio n. 2
0
        private ParseResult BinCompOp(Func <ParseResult> fn, params Token[] tokenTypes)
        {
            var leftParse = fn();

            if (leftParse.HasError())
            {
                return(leftParse);
            }
            var left = leftParse.Node;

            while (tokenTypes.Contains(current_token))
            {
                var op_tok = current_token;
                Advance();
                var rightParse = fn();
                if (rightParse.HasError())
                {
                    return(rightParse);
                }
                var right = rightParse.Node;
                left = new ConditionCompositeNode(left, op_tok, right).SetPos(left.Pos_Start, right.Pos_End);
            }
            return(left);
        }