public static ExprOp NewNode(OpKindEnum kind, ExprOp left = null, ExprOp right = null) { ExprOp node = new ExprOp() { Kind = kind }; if (left != null) { node.Left = left; } if (right != null) { node.Right = right; } return(node); }
public ExprOp(OpKindEnum kind) : this() { Kind = kind; }
public ExprOp ParseLogicExpr(InputTextStream inStream, AmountParseFlagsEnum tFlags) { ExprOp node = ParseAddExpr(inStream, tFlags); if (node != null && !tFlags.HasFlag(AmountParseFlagsEnum.PARSE_SINGLE)) { while (true) { OpKindEnum kind = OpKindEnum.LAST; AmountParseFlagsEnum flags = tFlags; ExprToken tok = NextToken(inStream, tFlags | AmountParseFlagsEnum.PARSE_OP_CONTEXT); bool negate = false; switch (tok.Kind) { case ExprTokenKind.EQUAL: if (tFlags.HasFlag(AmountParseFlagsEnum.PARSE_NO_ASSIGN)) { tok.Rewind(inStream); } else { kind = OpKindEnum.O_EQ; } break; case ExprTokenKind.NEQUAL: kind = OpKindEnum.O_EQ; negate = true; break; case ExprTokenKind.MATCH: kind = OpKindEnum.O_MATCH; break; case ExprTokenKind.NMATCH: kind = OpKindEnum.O_MATCH; negate = true; break; case ExprTokenKind.LESS: kind = OpKindEnum.O_LT; break; case ExprTokenKind.LESSEQ: kind = OpKindEnum.O_LTE; break; case ExprTokenKind.GREATER: kind = OpKindEnum.O_GT; break; case ExprTokenKind.GREATEREQ: kind = OpKindEnum.O_GTE; break; default: PushToken(tok); goto exitLoop; } if (kind != OpKindEnum.LAST) { ExprOp prev = node; node = new ExprOp(kind); node.Left = prev; node.Right = ParseAddExpr(inStream, flags); if (node.Right == null) { throw new ParseError(String.Format(ParseError.ParseError_OperatorNotFollowedByArgument, tok.Symbol)); } if (negate) { prev = node; node = new ExprOp(OpKindEnum.O_NOT); node.Left = prev; } } } } exitLoop: return(node); }