enum TokenType{ TT_UNKNOWN, TT_STRING, TT_INT, TT_FLOAT, TT_IDENTIFIER, TT_OPERATOR }; String TokenTypeName[] = { "TT_UNKNOWN", "TT_STRING", "TT_INT", "TT_FLOAT", "TT_IDENTIFIER", "TT_OPERATOR" }; struct Token { String literal = ""; TokenType type = TT_UNKNOWN; char delim = ' '; }; #define NEW_TOKEN { result.push_back(ctok); ctok = new Token(); goto eval_char; } std::vector script_tokenize(String code) { std::vector result; auto ctok = new Token(); for(auto c : code) { eval_char: if(ctok->type == TT_UNKNOWN) { if(isspace(c)) { } else if(isdigit(c)) { ctok->type = TT_INT; } else if(isalpha(c)) { ctok->type = TT_IDENTIFIER; } else if(c == '"' || c == '\'') { ctok->type = TT_STRING; ctok->delim = c; continue; } else if(ispunct(c)) { ctok->type = TT_OPERATOR; } } switch(ctok->type) { case(TT_IDENTIFIER): { if(isalnum(c) || c == '_') ctok->literal += c; else NEW_TOKEN break; } case(TT_INT): { if(isdigit(c)) ctok->literal += c; else if(c == '.') { ctok->type = TT_FLOAT; ctok->literal += c; } else NEW_TOKEN break; } case(TT_FLOAT): { if(isdigit(c)) ctok->literal += c; else NEW_TOKEN break; } case(TT_OPERATOR): { ctok->literal += c; c = ' '; NEW_TOKEN break; } case(TT_STRING): { if(c == ctok->delim) { c = ' '; NEW_TOKEN } else ctok->literal += c; break; } } } result.push_back(ctok); return(result); } String to_string(std::vector t) { String result = ""; for(auto& ti : t) { result += concat(TokenTypeName[ti->type], "(", ti->literal, ") "); } return(result); } // " RENDER(Request& context) { <>

UCE Test: Script

String script_src = first(context.post["code"], file_get_contents("script-example1.usp")); <>

Code

Params
}