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); }
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); }