OPerand now does its own expression parsing.
This commit is contained in:
1 parent
4d016197d2
commit
839f7e2eb8
11 files changed
+120
-115
No files matched your search
+102
-98
@@ -6,50 +6,54 @@
|
||||
|
||||
namespace jet {
|
||||
|
||||
Operand::Operand(coreutils::ZString &in) {
|
||||
Operand::Operand(coreutils::ZString &in, Global &global, std::map<coreutils::ZString, coreutils::MString> &lvariables) {
|
||||
|
||||
doubleValue = 0;
|
||||
|
||||
in.skipWhitespace();
|
||||
|
||||
if(in.ifNext("(")) {
|
||||
Operand op(in);
|
||||
if(in.startsWith("$[") || in.startsWith("#[")) {
|
||||
string = global.getVariable(in, lvariables);
|
||||
doubleValue = string.asDouble();
|
||||
isNumber = string.eod();
|
||||
string.reset();
|
||||
if((string == "false") || (string == "true"))
|
||||
boolean = true;
|
||||
} else if(in.ifNext("(")) {
|
||||
Operand op(in, global, lvariables);
|
||||
string = op.string;
|
||||
doubleValue = op.doubleValue;
|
||||
if(!in.ifNext(")"))
|
||||
throw coreutils::Exception("expected ) in expression.");
|
||||
}
|
||||
|
||||
if(in.ifNextIgnoreCase("SUBSTRING")) {
|
||||
} else if(in.ifNextIgnoreCase("SUBSTRING")) {
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for SUBSTRING parameters.");
|
||||
Operand parm1(in);
|
||||
Operand parm1(in, global, lvariables);
|
||||
if(!in.ifNext(","))
|
||||
throw coreutils::Exception("Expecting , in SUBSTRING expression.");
|
||||
Operand parm2(in);
|
||||
Operand parm2(in, global, lvariables);
|
||||
if(in.ifNext(")")) {
|
||||
string = parm1.string.substring(parm2.string.asInteger());
|
||||
}
|
||||
else if(!in.ifNext(","))
|
||||
} else if(!in.ifNext(","))
|
||||
throw coreutils::Exception("Expecting , in SUBSTRING expression.");
|
||||
Operand parm3(in);
|
||||
Operand parm3(in, global, lvariables);
|
||||
if(in.ifNext(")")) {
|
||||
string = parm1.string.substring(parm2.string.asInteger(), parm3.string.asInteger());
|
||||
}
|
||||
else
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of substring expression.");
|
||||
} else if(in.ifNextIgnoreCase("LEFT")) {
|
||||
if(!in.ifNext("("))
|
||||
throw coreutils::Exception("Expecting ( for LEFT parameters.");
|
||||
Operand parm1(in);
|
||||
Operand parm1(in, global, lvariables);
|
||||
if(!in.ifNext(","))
|
||||
throw coreutils::Exception("Expecting , in LEFT expression.");
|
||||
Operand parm2(in);
|
||||
Operand parm2(in, global, lvariables);
|
||||
if(in.ifNext(")")) {
|
||||
string = parm1.string.substring(0, parm2.string.asInteger());
|
||||
}
|
||||
else
|
||||
} else
|
||||
throw coreutils::Exception("Expecting ) at end of LEFT expression.");
|
||||
} else if(in.ifNextIgnoreCase("EXPR")) {
|
||||
|
||||
} else if(in.ifNextIgnoreCase("RIGHT")) {
|
||||
|
||||
} else if(in.ifNextIgnoreCase("TRIM")) {
|
||||
@@ -88,82 +92,10 @@ namespace jet {
|
||||
isNumber = false;
|
||||
}
|
||||
|
||||
in.skipWhitespace();
|
||||
|
||||
if(in.ifNext("=")) {
|
||||
Operand op(in);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue == op.doubleValue) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
} else if(!isNumber && !op.isNumber) {
|
||||
if(string == op.string) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
}
|
||||
}
|
||||
if(in.ifNext("<")) {
|
||||
Operand op(in);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue < op.doubleValue) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
} else if(!isNumber && !op.isNumber) {
|
||||
if(string < op.string) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
}
|
||||
}
|
||||
if(in.ifNext(">")) {
|
||||
Operand op(in);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue > op.doubleValue) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
} else if(!isNumber && !op.isNumber) {
|
||||
if(string > op.string) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
}
|
||||
}
|
||||
in.skipWhitespace();
|
||||
|
||||
if(in.ifNext("!=") || in.ifNext("<>")) {
|
||||
Operand op(in);
|
||||
Operand op(in, global, lvariables);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue != op.doubleValue) {
|
||||
boolean = true;
|
||||
@@ -187,7 +119,7 @@ namespace jet {
|
||||
}
|
||||
}
|
||||
if(in.ifNext("<=")) {
|
||||
Operand op(in);
|
||||
Operand op(in, global, lvariables);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue <= op.doubleValue) {
|
||||
boolean = true;
|
||||
@@ -211,7 +143,7 @@ namespace jet {
|
||||
}
|
||||
}
|
||||
if(in.ifNext(">=")) {
|
||||
Operand op(in);
|
||||
Operand op(in, global, lvariables);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue >= op.doubleValue) {
|
||||
boolean = true;
|
||||
@@ -234,9 +166,81 @@ namespace jet {
|
||||
}
|
||||
}
|
||||
}
|
||||
if(in.ifNext("=")) {
|
||||
Operand op(in, global, lvariables);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue == op.doubleValue) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
} else if(!isNumber && !op.isNumber) {
|
||||
if(string == op.string) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
}
|
||||
}
|
||||
if(in.ifNext("<")) {
|
||||
Operand op(in, global, lvariables);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue < op.doubleValue) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
} else if(!isNumber && !op.isNumber) {
|
||||
if(string < op.string) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
}
|
||||
}
|
||||
if(in.ifNext(">")) {
|
||||
Operand op(in, global, lvariables);
|
||||
if(isNumber && op.isNumber) {
|
||||
if(doubleValue > op.doubleValue) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
} else if(!isNumber && !op.isNumber) {
|
||||
if(string > op.string) {
|
||||
boolean = true;
|
||||
isNumber = false;
|
||||
string = "true";
|
||||
} else {
|
||||
boolean = false;
|
||||
isNumber = false;
|
||||
string = "false";
|
||||
}
|
||||
}
|
||||
}
|
||||
if(in.ifNext("+")) {
|
||||
if(isNumber) {
|
||||
Operand op(in);
|
||||
Operand op(in, global, lvariables);
|
||||
if(op.isNumber) {
|
||||
doubleValue += op.doubleValue;
|
||||
string = std::format("{:.12f}", doubleValue);
|
||||
@@ -247,7 +251,7 @@ namespace jet {
|
||||
throw coreutils::Exception("operand is not a number.");
|
||||
} else if(in.ifNext("-")) {
|
||||
if(isNumber) {
|
||||
Operand op(in);
|
||||
Operand op(in, global, lvariables);
|
||||
if(op.isNumber) {
|
||||
doubleValue -= op.doubleValue;
|
||||
string = std::format("{:.12f}", doubleValue);
|
||||
@@ -258,7 +262,7 @@ namespace jet {
|
||||
throw coreutils::Exception("operand is not a number.");
|
||||
} else if(in.ifNext("*")) {
|
||||
if(isNumber) {
|
||||
Operand op(in);
|
||||
Operand op(in, global, lvariables);
|
||||
if(op.isNumber) {
|
||||
doubleValue *= op.doubleValue;
|
||||
string = std::format("{:.12f}", doubleValue);
|
||||
@@ -269,7 +273,7 @@ namespace jet {
|
||||
throw coreutils::Exception("operand is not a number.");
|
||||
} else if(in.ifNext("/")) {
|
||||
if(isNumber) {
|
||||
Operand op(in);
|
||||
Operand op(in, global, lvariables);
|
||||
if(op.isNumber) {
|
||||
doubleValue /= op.doubleValue;
|
||||
string = std::format("{:.12f}", doubleValue);
|
||||
|
||||
Reference in new issue
Block a user