--- parser3/src/main/execute.C 2001/03/06 15:55:35 1.55 +++ parser3/src/main/execute.C 2001/03/07 10:10:50 1.59 @@ -1,5 +1,5 @@ /* - $Id: execute.C,v 1.55 2001/03/06 15:55:35 paf Exp $ + $Id: execute.C,v 1.59 2001/03/07 10:10:50 paf Exp $ */ #include "pa_array.h" @@ -41,8 +41,8 @@ char *opcode_name[]={ "NEG", "INV", "NOT", "DEF", "IN", "FEXISTS", // expression ops: binary "SUB", "ADD", "MUL", "DIV", "MOD", - "BIN_AND", "BIN_OR", - "LOG_AND", "LOG_OR", + "BIN_AND", "BIN_OR", "BIN_XOR", + "LOG_AND", "LOG_OR", "LOG_XOR", "NUM_LT", "NUM_GT", "NUM_LE", "NUM_GE", "NUM_EQ", "NUM_NE", "STR_LT", "STR_GT", "STR_LE", "STR_GE", "STR_EQ", "STR_NE" }; @@ -110,6 +110,11 @@ void Request::execute(const Array& ops) const Array *local_ops=reinterpret_cast(ops.quick_get(++i)); fprintf(stderr, " (%d)\n", local_ops->size()); dump(1, *local_ops); + // TODO: rcontext junction должен быть контекстом вызываемого объекта + // чтобы вот эти конструкции орудовали одними полями внутри {} : + // $var{$field} + // ^var.menu{$field} + // поскольку они суть одно и то же, и так удобнее Junction& j=*NEW Junction(pool(), *self, 0, 0, root,rcontext,wcontext,local_ops); @@ -307,8 +312,7 @@ void Request::execute(const Array& ops) case OP_INV: { Value *operand=POP(); - Value *value=NEW VDouble(pool(), - ~static_cast(operand->get_double())); + Value *value=NEW VDouble(pool(), ~static_cast(operand->get_double())); PUSH(value); break; } @@ -392,6 +396,16 @@ void Request::execute(const Array& ops) PUSH(value); break; } + case OP_BIN_XOR: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VDouble(pool(), + static_cast(a->get_double()) ^ + static_cast(b->get_double())); + PUSH(value); + break; + } case OP_LOG_AND: { Value *b=POP(); @@ -412,6 +426,16 @@ void Request::execute(const Array& ops) PUSH(value); break; } + case OP_LOG_XOR: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->get_bool() ^ + b->get_bool()); + PUSH(value); + break; + } case OP_NUM_LT: { Value *b=POP(); @@ -472,18 +496,63 @@ void Request::execute(const Array& ops) PUSH(value); break; } - case OP_STR_LT: - case OP_STR_GT: + case OP_STR_LT: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->as_string() < + b->as_string()); + PUSH(value); + break; + } + case OP_STR_GT: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->as_string() > + b->as_string()); + PUSH(value); + break; + } case OP_STR_LE: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->as_string() <= + b->as_string()); + PUSH(value); + break; + } case OP_STR_GE: - case OP_STR_EQ: - case OP_STR_NE: { Value *b=POP(); Value *a=POP(); Value *value=NEW VBool(pool(), - /*a->get_string() @ - b->get_string()*/false); + a->as_string() >= + b->as_string()); + PUSH(value); + break; + } + case OP_STR_EQ: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->as_string() == + b->as_string()); + PUSH(value); + break; + } + case OP_STR_NE: + { + Value *b=POP(); + Value *a=POP(); + Value *value=NEW VBool(pool(), + a->as_string() != + b->as_string()); PUSH(value); break; }