Statement TextParser::parse_statement(const Token *t)
{
Statement result;
- bool sub = false;
- bool finish = false;
+ unsigned sub = 0;
while(in)
{
result.source = src;
result.line = in.get_line_number();
}
- else if(sub)
+ else if(sub==1)
{
if(token.str=="}")
- {
- sub = false;
- finish = true;
- }
+ sub = 2;
else
{
Statement ss = parse_statement(&token);
result.sub.push_back(ss);
}
}
- else if(finish)
+ else if(sub==2)
{
if(token.str!=";")
throw syntax_error(token.str);
break;
}
else if(token.str=="{")
- sub = true;
+ sub = 1;
else if(token.str==";")
break;
- else if(token.type==Token::INTEGER)
- result.append(lexical_cast<IntType::Store>(token.str));
- else if(token.type==Token::FLOAT)
- result.append(lexical_cast<FloatType::Store>(token.str));
- else if(token.type==Token::STRING)
- result.append(token.str);
- else if(token.type==Token::IDENTIFIER)
- {
- if(token.str=="true")
- result.append(true);
- else if(token.str=="false")
- result.append(false);
- else
- result.append(Symbol(token.str));
- }
+ else if(token.type!=Token::SPECIAL)
+ result.append_from_token(token);
else
throw syntax_error(token.str);
}
FLOATEXPINIT,
FLOATEXPSIGN,
STRING,
+ STRING_ESCAPE,
ACCEPT,
ZERO,
DECIMAL,
Token::SPECIAL,
Token::SPECIAL,
Token::SPECIAL,
+ Token::SPECIAL,
Token::INTEGER,
Token::INTEGER,
Token::INTEGER,
ParseState state = INIT;
string buf;
- bool escape = false;
while(in || state==INIT)
{
case STRING:
if(c=='\\')
- escape = !escape;
- else if(c=='"' && !escape)
+ state = STRING_ESCAPE;
+ else if(c=='"')
state = STRING_END;
- else
- escape = false;
+ break;
+
+ case STRING_ESCAPE:
+ state = STRING;
break;
case IDENTIFIER: