Subversion Repositories spk

Rev

Rev 114 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#ifndef BOD_PARSER_BASE_INCLUDED
#define BOD_PARSER_BASE_INCLUDED

#include "../common/ext_list.h"
#include "bod_text_parser.h"
#include "token_stream.h"

// I must get rid of COM S_OK definition to be able to use it later in enum
#ifdef S_OK 
#undef S_OK
#endif

class bod_parser_base
{
        public:
                enum ErrorSeverity
                {
                        _S_OK = 0,
                        S_Error,
                        S_Warning
                };

                enum ErrorCode
                {
                        E_Error
                };

                enum ErrorFacility
                {
                        F_Compiler
                };

                struct Error
                {
                        int     code;
                        char text[255];
                        int line, col;

                        void makeCode(ErrorFacility f, ErrorSeverity s, ErrorCode e)
                        {
                                code=s << 24;
                                code|=f << 16;
                                code|=e;
                        }

                        ErrorSeverity severity() const { return (ErrorSeverity)(code >> 24); }
                        ErrorFacility facility() const { return (ErrorFacility)((code >> 16) & 0xff); }
                        bool failed() const { return (severity() & S_Error) > 0; }
                        bool warning() const { return (severity() & S_Warning) > 0; }
                        bool succeeded() const { return (severity() & _S_OK) == 0; }

                        ErrorCode getCode() const { return (ErrorCode)(code & 0xFFFF); }
                };

        protected:
                typedef bod_text_parser::token token;
                typedef ext::list<Error*> ErrorList;

                void error(const bod_text_parser::token *t, ErrorSeverity severity, const char *format, ...);

        public:
                typedef ErrorList::iterator iterator;
                typedef token_stream<bod_text_parser> token_stream;

                ErrorList errors;

                virtual ~bod_parser_base() { clearErrors(); }

                void clearErrors()
                {
                        for(iterator &it=errors.begin(); it!=errors.end(); ++it){
                                delete *it;
                        }
                }

        protected:
                token* loadValue(token_stream& is, const char *context="");
                bool loadIntValue(token_stream& is, int *i, const char *context="");
                bool loadDoubleValue(token_stream& is, double *d, const char *context="");
                char * loadString(token_stream& is, const char *context="");
                static bool ungetValue(token_stream& s);
};

#endif // !defined(BOD_PARSER_BASE_INCLUDED)