mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-10-24 10:27:45 +00:00
parser:: skip_white
This commit is contained in:
25
util.cpp
25
util.cpp
@@ -139,6 +139,10 @@ struct exp_parser {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void skip_white();
|
||||||
|
|
||||||
|
char snext(int step=0) { skip_white(); return next(step); }
|
||||||
|
|
||||||
cld parse(int prio = 0);
|
cld parse(int prio = 0);
|
||||||
|
|
||||||
cld parsepar() {
|
cld parsepar() {
|
||||||
@@ -151,9 +155,13 @@ struct exp_parser {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void exp_parser::skip_white() {
|
||||||
|
while(next() == ' ' || next() == '\n' || next() == '\r' || next() == '\t') at++;
|
||||||
|
}
|
||||||
|
|
||||||
cld exp_parser::parse(int prio) {
|
cld exp_parser::parse(int prio) {
|
||||||
cld res;
|
cld res;
|
||||||
while(next() == ' ') at++;
|
skip_white();
|
||||||
if(eat("sin(")) res = sin(parsepar());
|
if(eat("sin(")) res = sin(parsepar());
|
||||||
else if(eat("cos(")) res = cos(parsepar());
|
else if(eat("cos(")) res = cos(parsepar());
|
||||||
else if(eat("sinh(")) res = sinh(parsepar());
|
else if(eat("sinh(")) res = sinh(parsepar());
|
||||||
@@ -177,24 +185,24 @@ cld exp_parser::parse(int prio) {
|
|||||||
else if(eat("to01(")) { res = parsepar(); return atan(res) / ld(M_PI) + ld(0.5); }
|
else if(eat("to01(")) { res = parsepar(); return atan(res) / ld(M_PI) + ld(0.5); }
|
||||||
else if(eat("ifp(")) {
|
else if(eat("ifp(")) {
|
||||||
cld cond = parse(0);
|
cld cond = parse(0);
|
||||||
if(next() != ',') {at = -1; return 0; } at++;
|
if(snext() != ',') {at = -1; return 0; } at++;
|
||||||
cld yes = parse(0);
|
cld yes = parse(0);
|
||||||
if(next() != ',') {at = -1; return 0; } at++;
|
if(snext() != ',') {at = -1; return 0; } at++;
|
||||||
cld no = parsepar();
|
cld no = parsepar();
|
||||||
return real(cond) > 0 ? yes : no;
|
return real(cond) > 0 ? yes : no;
|
||||||
}
|
}
|
||||||
else if(eat("wallif(")) {
|
else if(eat("wallif(")) {
|
||||||
cld val0 = parse(0);
|
cld val0 = parse(0);
|
||||||
if(next() != ',') {at = -1; return 0; } at++;
|
if(snext() != ',') {at = -1; return 0; } at++;
|
||||||
cld val1 = parsepar();
|
cld val1 = parsepar();
|
||||||
if(real(extra_params["p"]) >= 3.5) return val0;
|
if(real(extra_params["p"]) >= 3.5) return val0;
|
||||||
else return val1;
|
else return val1;
|
||||||
}
|
}
|
||||||
else if(eat("rgb(")) {
|
else if(eat("rgb(")) {
|
||||||
cld val0 = parse(0);
|
cld val0 = parse(0);
|
||||||
if(next() != ',') {at = -1; return 0; } at++;
|
if(snext() != ',') {at = -1; return 0; } at++;
|
||||||
cld val1 = parse(0);
|
cld val1 = parse(0);
|
||||||
if(next() != ',') {at = -1; return 0; } at++;
|
if(snext() != ',') {at = -1; return 0; } at++;
|
||||||
cld val2 = parsepar();
|
cld val2 = parsepar();
|
||||||
switch(int(real(extra_params["p"]) + .5)) {
|
switch(int(real(extra_params["p"]) + .5)) {
|
||||||
case 1: return val0;
|
case 1: return val0;
|
||||||
@@ -205,16 +213,17 @@ cld exp_parser::parse(int prio) {
|
|||||||
}
|
}
|
||||||
else if(eat("let(")) {
|
else if(eat("let(")) {
|
||||||
string name;
|
string name;
|
||||||
|
skip_white();
|
||||||
while(true) {
|
while(true) {
|
||||||
char c = next();
|
char c = next();
|
||||||
if((c >= '0' && c <= '9') || (c == '.' && next(1) != '.') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
|
if((c >= '0' && c <= '9') || (c == '.' && next(1) != '.') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
|
||||||
name += c, at++;
|
name += c, at++;
|
||||||
else break;
|
else break;
|
||||||
}
|
}
|
||||||
if(next() != '=') { at = -1; return 0; }
|
if(snext() != '=') { at = -1; return 0; }
|
||||||
at++;
|
at++;
|
||||||
cld val = parse(0);
|
cld val = parse(0);
|
||||||
if(next() != ',') { at = -1; return 0; }
|
if(snext() != ',') { at = -1; return 0; }
|
||||||
at++;
|
at++;
|
||||||
dynamicval<cld> d(extra_params[name], val);
|
dynamicval<cld> d(extra_params[name], val);
|
||||||
return parsepar();
|
return parsepar();
|
||||||
|
|||||||
Reference in New Issue
Block a user