00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #ifndef __SCANNER_HPP__
00025 #define __SCANNER_HPP__
00026 
00027 #include <QObject>
00028 #include <QString>
00029 
00030 #include "global.h"
00031 
00032 enum ETokenType
00033 {
00034         TK_Identifier,          
00035         TK_StringConst,         
00036         TK_IntConst,            
00037         TK_FloatConst,          
00038         TK_BoolConst,           
00039         TK_AndAnd,                      
00040         TK_OrOr,                        
00041         TK_EqEq,                        
00042         TK_NotEq,                       
00043         TK_GtrEq,                       
00044         TK_LessEq,                      
00045         TK_ShiftLeft,           
00046         TK_ShiftRight,          
00047         TK_Increment,           
00048         TK_Decrement,           
00049         TK_PointerMember,       
00050         TK_ScopeResolution,     
00051         TK_MacroConcat,         
00052         TK_AddEq,                       
00053         TK_SubEq,                       
00054         TK_MulEq,                       
00055         TK_DivEq,                       
00056         TK_ModEq,                       
00057         TK_ShiftLeftEq,         
00058         TK_ShiftRightEq,        
00059         TK_AndEq,                       
00060         TK_OrEq,                        
00061         TK_XorEq,                       
00062         TK_Ellipsis,            
00063 
00064         TK_NumSpecialTokens,
00065 
00066         TK_NoToken = -1
00067 };
00068 
00073 class MAIN_EXPORT Scanner
00074 {
00075         public:
00076                 struct ParserState
00077                 {
00078                         QString                 str;
00079                         unsigned int    number;
00080                         double                  decimal;
00081                         bool                    boolean;
00082                         char                    token;
00083                         unsigned int    tokenLine;
00084                         unsigned int    tokenLinePosition;
00085                         unsigned int    scanPos;
00086                 };
00087 
00088                 enum MessageLevel
00089                 {
00090                         ML_ERROR,
00091                         ML_WARNING,
00092                         ML_NOTICE
00093                 };
00094 
00095                 Scanner(const char* data, int length=-1);
00096                 ~Scanner();
00097 
00098                 void                    checkForMeta();
00103                 void                    checkForWhitespace();
00109                 bool                    checkToken(char token);
00113                 void                    expandState();
00114                 int                             currentLine() const { return state.tokenLine; }
00115                 int                             currentLinePos() const { return state.tokenLinePosition; }
00116                 int                             currentPos() const { return logicalPosition; }
00117                 unsigned int    currentScanPos() const { return scanPos; }
00118                 bool                    nextString();
00123                 bool                    nextToken(bool autoExpandState=true);
00124                 void                    mustGetToken(char token);
00125                 void                    rewind(); 
00126                 const char*             scriptData() const { return data; }
00127                 void                    scriptMessage(MessageLevel level, const char* error, ...) const;
00128                 void                    setScriptIdentifier(const QString &ident) { scriptIdentifier = ident; }
00129                 int                             skipLine();
00130 
00134                 bool                    tokensLeft() { return scanPos < length; }
00135 
00136                 const ParserState &operator*() const { return state; }
00137                 const ParserState *operator->() const { return &state; }
00138 
00139                 static const QString& escape(QString &str);
00140                 static const QString& unescape(QString &str);
00141 
00142                 static void             setMessageHandler(void (*handler)(MessageLevel, const char*, va_list)) { messageHandler = handler; }
00143 
00144                 ParserState             state;
00145 
00146         protected:
00151                 void            incrementLine();
00152 
00153         private:
00154                 ParserState             nextState, prevState;
00155 
00156                 char*                   data;
00157                 unsigned int    length;
00158 
00159                 unsigned int    line;
00160                 unsigned int    lineStart;
00161                 unsigned int    logicalPosition;
00162                 unsigned int    scanPos;
00163 
00164                 bool                    needNext; 
00165 
00166                 QString                 scriptIdentifier;
00167 
00168                 static void             (*messageHandler)(MessageLevel, const char*, va_list);
00169 };
00170 
00171 #endif