Allow numbers to begin with a plus sign
Support exponents in floating point numbers
void add(const std::string &k, T L::*p)
{ actions.insert(typename ActionMap::value_type(k, new LoadValue<L, T>(p))); }
void add(const std::string &k, T L::*p)
{ actions.insert(typename ActionMap::value_type(k, new LoadValue<L, T>(p))); }
+ void add(const std::string &k)
+ { actions.insert(ActionMap::value_type(k, 0)); }
+
template<typename S>
void load_sub(S &s)
{ load_sub<S, typename S::Loader>(s); }
template<typename S>
void load_sub(S &s)
{ load_sub<S, typename S::Loader>(s); }
ActionMap::iterator j=actions.find(st.keyword);
if(j==actions.end())
throw Exception(st.get_location()+": Unknown keyword '"+st.keyword+"'");
ActionMap::iterator j=actions.find(st.keyword);
if(j==actions.end())
throw Exception(st.get_location()+": Unknown keyword '"+st.keyword+"'");
- j->second->execute(*this, st);
+ if(j->second)
+ j->second->execute(*this, st);
+ SIGN,
+ FLOATEXPINIT,
+ FLOATEXPSIGN,
HEXADECIMAL,
OCTAL,
FLOAT,
HEXADECIMAL,
OCTAL,
FLOAT,
IDENTIFIER
};
static Token::Type token_type[]=
{
IDENTIFIER
};
static Token::Type token_type[]=
{
+ Token::SPECIAL,
+ Token::SPECIAL,
Token::SPECIAL,
Token::SPECIAL,
Token::STRING,
Token::SPECIAL,
Token::SPECIAL,
Token::STRING,
Token::INTEGER,
Token::INTEGER,
Token::FLOAT,
Token::INTEGER,
Token::INTEGER,
Token::FLOAT,
case INIT:
if(c=='0')
state=ZERO;
case INIT:
if(c=='0')
state=ZERO;
- else if(c=='-')
- state=NEGATIVE;
+ else if(c=='-' || c=='+')
+ state=SIGN;
else if(c=='.')
state=FLOAT;
else if(c=='"')
else if(c=='.')
state=FLOAT;
else if(c=='"')
parse_error(c, state);
break;
parse_error(c, state);
break;
if(c=='0')
state=ZERO;
else if(isdigit(c))
if(c=='0')
state=ZERO;
else if(isdigit(c))
+ if(c=='e' || c=='E')
+ state=FLOATEXPINIT;
+ else if(!isdigit(c))
+ parse_error(c, state);
+ break;
+
+ case FLOATEXPINIT:
+ if(c=='+' || c=='-')
+ state=FLOATEXPSIGN;
+ else if(isdigit(c))
+ state=FLOATEXP;
+ else
+ parse_error(c, state);
+ break;
+
+ case FLOATEXPSIGN:
+ if(isdigit(c))
+ state=FLOATEXP;
+ else
+ parse_error(c, state);
+ break;
+
+ case FLOATEXP:
if(!isdigit(c))
parse_error(c, state);
break;
if(!isdigit(c))
parse_error(c, state);
break;