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)