1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-06-24 06:03:23 +00:00

parser:: factored out next_token()

This commit is contained in:
Zeno Rogue 2019-12-23 21:49:17 +01:00
parent 15000034fd
commit 4144c2b928

View File

@ -145,7 +145,9 @@ struct exp_parser {
}
void skip_white();
string next_token();
char snext(int step=0) { skip_white(); return next(step); }
cld parse(int prio = 0);
@ -170,7 +172,19 @@ struct exp_parser {
void exp_parser::skip_white() {
while(next() == ' ' || next() == '\n' || next() == '\r' || next() == '\t') at++;
}
string exp_parser::next_token() {
skip_white();
string token;
while(true) {
char c = next();
if((c >= '0' && c <= '9') || (c == '.' && next(1) != '.') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
token += c, at++;
else break;
}
return token;
}
cld exp_parser::parse(int prio) {
cld res;
skip_white();
@ -224,14 +238,7 @@ cld exp_parser::parse(int prio) {
}
}
else if(eat("let(")) {
string name;
skip_white();
while(true) {
char c = next();
if((c >= '0' && c <= '9') || (c == '.' && next(1) != '.') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
name += c, at++;
else break;
}
string name = next_token();
force_eat("=");
cld val = parse(0);
force_eat(",");
@ -246,13 +253,7 @@ cld exp_parser::parse(int prio) {
#endif
else if(next() == '(') at++, res = parsepar();
else {
string number;
while(true) {
char c = next();
if((c >= '0' && c <= '9') || (c == '.' && next(1) != '.') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')
number += c, at++;
else break;
}
string number = next_token();
if(number == "e") res = exp(1);
else if(number == "i") res = cld(0, 1);
else if(number == "p" || number == "pi") res = M_PI;