X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Fparser.cpp;h=f74be86396881917caf46fec861a923d954f5293;hp=8707cedae643d829a32dbf193d2474b03593c133;hb=80d6c4f64ad4d293cc23e845f7013d6d45c309c5;hpb=5453824394771ca21de32088a2842486b63e6f6d diff --git a/source/parser.cpp b/source/parser.cpp index 8707ced..f74be86 100644 --- a/source/parser.cpp +++ b/source/parser.cpp @@ -1,19 +1,17 @@ /* This file is part of libmspparser -Copyright © 2006 Mikko Rasa, Mikkosoft Productions +Copyright © 2006 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ #include +#include #include -#include #include "parser.h" #include "statement.h" #include "token.h" using namespace std; -#include - namespace Msp { namespace Parser { @@ -61,7 +59,7 @@ Statement Parser::parse_(const Token *t) if(token.str.empty()) break; else if(token.type!=Token::IDENTIFIER) - throw DataError(get_location()+format(": Syntax error at token '%S' (expected an identifier)", &token.str).str()); + throw DataError(get_location()+": Syntax error at token '"+token.str+"' (expected an identifier)"); result.keyword=token.str; result.valid=true; result.source=src; @@ -83,7 +81,7 @@ Statement Parser::parse_(const Token *t) else if(finish) { if(token.str!=";") - throw DataError(get_location()+format(": Syntax error at token '%S' (Expected a ';')", &token.str).str()); + throw DataError(get_location()+": Syntax error at token '"+token.str+"' (Expected a ';')"); break; } else if(token.str=="{") @@ -98,6 +96,12 @@ Statement Parser::parse_(const Token *t) result.args.push_back(Value(Value::STRING, token.str)); else if(token.type==Token::IDENTIFIER) { + if(token.str=="true") + result.args.push_back(Value(Value::BOOLEAN, "1")); + else if(token.str=="false") + result.args.push_back(Value(Value::BOOLEAN, "0")); + else + result.args.push_back(Value(Value::ENUM, token.str)); //result.args.push_back(resolve_identifiertoken.str); } else if(token.str=="") @@ -139,7 +143,9 @@ Token Parser::parse_token() enum ParseState { INIT, - NEGATIVE, + SIGN, + FLOATEXPINIT, + FLOATEXPSIGN, STRING, ACCEPT, ZERO, @@ -147,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, @@ -161,6 +170,7 @@ Token Parser::parse_token() Token::INTEGER, Token::INTEGER, Token::FLOAT, + Token::FLOAT, Token::IDENTIFIER }; @@ -181,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=='"') @@ -197,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)) @@ -237,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; @@ -336,7 +369,9 @@ string Parser::get_location() void Parser::parse_error(int c, int state) { - throw DataError(get_location()+format(": Parse error at '%c' (state %d)", c, state).str()); + ostringstream ss; + ss<