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