]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/parser.cpp
Support ignoring statements
[libs/datafile.git] / source / parser.cpp
index ef2daa3e0ab8bd5dbb75ce8696a64c789c8417ab..f74be86396881917caf46fec861a923d954f5293 100644 (file)
@@ -1,6 +1,6 @@
 /*
 This file is part of libmspparser
-Copyright © 2006 Mikko Rasa, Mikkosoft Productions
+Copyright © 2006  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 #include <cctype>
@@ -96,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=="")
@@ -137,7 +143,9 @@ Token Parser::parse_token()
        enum ParseState
        {
                INIT,
-               NEGATIVE,
+               SIGN,
+               FLOATEXPINIT,
+               FLOATEXPSIGN,
                STRING,
                ACCEPT,
                ZERO,
@@ -145,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,
@@ -159,6 +170,7 @@ Token Parser::parse_token()
                Token::INTEGER,
                Token::INTEGER,
                Token::FLOAT,
+               Token::FLOAT,
                Token::IDENTIFIER
        };
 
@@ -179,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=='"')
@@ -195,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))
@@ -235,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;
@@ -335,7 +370,7 @@ string Parser::get_location()
 void Parser::parse_error(int c, int state)
 {
        ostringstream ss;
-       ss<<get_location()<<": Parse error at '"<<c<<"' (state "<<state<<')';
+       ss<<get_location()<<": Parse error at '"<<(char)c<<"' (state "<<state<<')';
        throw DataError(ss.str());
 }