+ state = STRING_END;
+ else
+ escape = false;
+ break;
+
+ case IDENTIFIER:
+ if(!isalpha(c) && !isdigit(c) && c!='_' && c!='-' && c!='/')
+ parse_error(c, "0-9A-Za-z_/-");
+ break;
+
+ case STRING_END:
+ throw_at(ParseError("Garbage after string"), get_location());
+
+ default:
+ throw_at(InvalidState("Internal error (bad state)"), get_location());
+ }
+
+ if(is_delimiter(next) && state>=ACCEPT)
+ {
+ if(state==IDENTIFIER && buf[0]=='\\')
+ return Token(Token::IDENTIFIER, buf.substr(1));
+ else if(state==STRING_END)