X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fparser.cpp;h=f74be86396881917caf46fec861a923d954f5293;hb=47597fd1b0b11c915466dd7f3f1281906442377c;hp=7b9af11d60ca292a860ae346cebcb813220e5469;hpb=36e888dd1208822ae6df13b63f32c97d36b0a616;p=libs%2Fdatafile.git diff --git a/source/parser.cpp b/source/parser.cpp index 7b9af11..f74be86 100644 --- a/source/parser.cpp +++ b/source/parser.cpp @@ -143,7 +143,9 @@ Token Parser::parse_token() enum ParseState { INIT, - NEGATIVE, + SIGN, + FLOATEXPINIT, + FLOATEXPSIGN, STRING, ACCEPT, ZERO, @@ -151,11 +153,14 @@ Token Parser::parse_token() HEXADECIMAL, OCTAL, FLOAT, + FLOATEXP, IDENTIFIER }; static Token::Type token_type[]= { + Token::SPECIAL, + Token::SPECIAL, Token::SPECIAL, Token::SPECIAL, Token::STRING, @@ -165,6 +170,7 @@ Token Parser::parse_token() Token::INTEGER, Token::INTEGER, Token::FLOAT, + Token::FLOAT, Token::IDENTIFIER }; @@ -185,8 +191,8 @@ Token Parser::parse_token() 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=='"') @@ -201,7 +207,7 @@ Token Parser::parse_token() parse_error(c, state); break; - case NEGATIVE: + case SIGN: if(c=='0') state=ZERO; else if(isdigit(c)) @@ -241,6 +247,29 @@ Token Parser::parse_token() break; case FLOAT: + 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;