1 // 2 // File: OracleParser.h 3 // This code was produced by the dragon parser generator 4 // 5 #include <lfcbase/Exception.h> 6 #include <lfcbase/Chain.h> 7 #include <lfcbase/ListT.h> 8 #define MAXTOKENVAL 100 9 10 class OracleParser 11 { 12 13 public: 14 15 OracleParser(); 16 ~OracleParser(); 17 18 void parse(); getTokenList()19 ListT<Chain>& getTokenList() { return _tokenList; } 20 21 protected: 22 23 virtual char nextChar() = 0; 24 virtual void backChar() = 0; 25 virtual void postAction() = 0; 26 virtual void execCreate() = 0; 27 virtual void execDrop() = 0; 28 virtual void dropOpt1() = 0; 29 virtual void dropOpt2() = 0; 30 virtual void storeAttrColumn() = 0; 31 virtual void storeNotNullOpt() = 0; 32 virtual void storeNullOpt() = 0; 33 virtual void storeDefaultOpt() = 0; 34 virtual void storeDefaultNullOpt() = 0; 35 virtual void storePrimaryKey() = 0; 36 virtual void storeUniqueKey() = 0; 37 virtual void storeKey() = 0; 38 virtual void storeKeyColumn() = 0; 39 virtual void insertPostAction() = 0; 40 virtual void execInsert() = 0; 41 virtual void insertConstValue() = 0; 42 virtual void insertPreAction() = 0; 43 virtual void storeTable() = 0; 44 virtual void storeIntType() = 0; 45 virtual void storeDecimalType() = 0; 46 virtual void storeVarcharType() = 0; 47 virtual void storeTimestampType() = 0; 48 virtual void storeDatetimeType() = 0; 49 virtual void storeMediumTextType() = 0; 50 virtual void storeEnumType() = 0; 51 virtual void storeIntValue() = 0; 52 virtual void storeNegIntValue() = 0; 53 virtual void storeVarcharValue() = 0; 54 virtual void storeNullValue() = 0; 55 virtual void storeDim() = 0; 56 virtual void storeDecimalDim() = 0; 57 virtual void storeUnsignedType() = 0; 58 59 enum Token { 60 IDENTIFIER, 61 QIDENTIFIER, 62 FLOATVAL, 63 INTVAL, 64 SEMICOLON, 65 RB, 66 LB, 67 KSEP, 68 EQU, 69 MINUS, 70 WRITE, 71 VARCHAR, 72 VALUES, 73 UNSIGNED, 74 UNIQUE, 75 UNLOCK, 76 TIMESTAMP, 77 TEXT, 78 TABLES, 79 TABLE, 80 SET, 81 PRIMARY, 82 NULLTOKEN, 83 NOT, 84 MEDIUMTEXT, 85 LONGBLOB, 86 LOCK, 87 KEY, 88 INSERT, 89 INTO, 90 INT, 91 INDEX, 92 IF, 93 FOREIGN, 94 FLOAT, 95 FALSEVAL, 96 EXISTS, 97 ENGINE, 98 ENUM, 99 DROP, 100 DOUBLE, 101 DEFAULT, 102 DECIMAL, 103 DATETIME, 104 CREATE, 105 BOOL, 106 STRINGVAL, 107 ENDTOKEN 108 }; 109 void setReserved(Token t); 110 111 private: 112 113 enum Symbol { PROD, TOKEN, NONE }; 114 enum ScannerStateType { START, INTERMEDIATE, FINAL, ANY }; 115 enum Action { SHIFT, REDUCE, ACCEPT, NULLACTION }; 116 enum Production { 117 Start, 118 StatementList, 119 Statement, 120 DropOpt, 121 ColumnList, 122 NullOpt, 123 DefaultNullOpt, 124 DefaultOpt, 125 DefaultDefOpt, 126 ColumnDesc, 127 KeyList, 128 InsertStatement, 129 InsertValueSpecList, 130 InsertValueSpec, 131 InsertValueList, 132 InsertPrefix, 133 Table, 134 DataTypeProd, 135 ConstList, 136 Constant, 137 DimOpt, 138 DecimalDimOpt, 139 UnsignedOpt 140 }; 141 void loadScanner(); 142 void loadParser0(); 143 void loadParser1(); 144 void loadParser2(); 145 void loadParser3(); 146 void loadParser4(); 147 void loadParser5(); 148 void loadParser6(); 149 150 class ScannerStateEntry { 151 152 public: 153 154 ScannerStateEntry(); 155 ScannerStateEntry(int state, ScannerStateType type = INTERMEDIATE); 156 ScannerStateEntry& operator = (const ScannerStateEntry& s); 157 bool operator == (const ScannerStateEntry& s); 158 159 int getState(); 160 ScannerStateType getType(); 161 162 private: 163 164 int _state; 165 ScannerStateType _type; 166 }; 167 168 class ScannerTransEntry { 169 170 public: 171 172 ScannerTransEntry(); 173 ScannerTransEntry(int state, char c); 174 ScannerTransEntry(int state, char c, int fstate); 175 ScannerTransEntry& operator = (const ScannerTransEntry& s); 176 bool operator == (const ScannerTransEntry& s); 177 178 int getFState(); 179 180 private: 181 182 int _state; 183 char _c; 184 int _fstate; 185 }; 186 187 class Scanner { 188 189 public: 190 191 Scanner(); 192 Scanner(Token t); 193 194 Token getToken(); 195 void addState(ScannerStateEntry s); 196 void addTransition(ScannerTransEntry t); 197 bool checkPattern(const Chain& pattern); 198 199 private: 200 201 Token _token; 202 ListT<ScannerStateEntry> _stateList; 203 ListT<ScannerTransEntry> _transList; 204 }; 205 206 ListT<Scanner> _scannerList; 207 class StackEntry { 208 209 public: 210 211 StackEntry(); 212 StackEntry(Symbol prod, int num, int state, Chain tval = ""); 213 StackEntry& operator = (const StackEntry& a); 214 215 int getState(); 216 Symbol getSymbol(); 217 Chain& getTval(); 218 219 private: 220 221 Symbol _symbol; 222 int _num; 223 int _state; 224 Chain _tval; 225 }; 226 227 class ActionEntry { 228 229 public: 230 231 ActionEntry(); 232 ActionEntry(Action action, int num); 233 bool operator == (const ActionEntry& a); 234 ActionEntry& operator = (const ActionEntry& a); 235 236 Action getAction(); 237 int getNum(); 238 239 private: 240 241 Action _action; 242 int _num; 243 }; 244 245 ActionEntry _actionMap[108][48]; 246 int _jumpMap[108][24]; 247 248 class ProdEntry { 249 250 public: 251 252 ProdEntry(); 253 ProdEntry(int id); 254 ProdEntry(int id, Production prod, int numSymbol); 255 bool operator == (const ProdEntry& a); 256 ProdEntry& operator = (const ProdEntry& a); 257 258 int getId(); 259 Production getProd(); 260 int getNumSymbol(); 261 262 private: 263 264 int _id; 265 Production _prod; 266 int _numSymbol; 267 268 }; 269 270 ListT<ProdEntry> _prodInfo; 271 272 bool isSepIgnore(char c); 273 bool isSepSign(char c); 274 bool shiftToken(); 275 276 bool getAction(int state, Token token, Action& a, int& num); 277 bool getJump(int state, Production prod, int& fstate); 278 279 Token _reservedToken; 280 bool _isReserved; 281 Token _token; 282 char _tokenVal[MAXTOKENVAL]; 283 ListT<Chain> _tokenList; 284 285 }; 286