Generated lexer depended on parser, fixed
[kdevelop:the-user-kdevelop-pg-qt.git] / kdev-pg / kdev-pg-code-gen.h
1 /* This file is part of kdev-pg-qt
2    Copyright (C) 2005 Roberto Raggi <roberto@kdevelop.org>
3    Copyright (C) 2006 Jakob Petsovits <jpetso@gmx.at>
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Library General Public
7    License as published by the Free Software Foundation; either
8    version 2 of the License, or (at your option) any later version.
9
10    This library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Library General Public License for more details.
14
15    You should have received a copy of the GNU Library General Public License
16    along with this library; see the file COPYING.LIB.  If not, write to
17    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18    Boston, MA 02110-1301, USA.
19 */
20
21 #ifndef KDEV_PG_CODEGEN_H
22 #define KDEV_PG_CODEGEN_H
23
24 #include "kdev-pg.h"
25 #include "kdev-pg-default-visitor.h"
26
27 namespace KDevPG
28 {
29
30 /**
31  * This class is the LL/shunting yard-parser code generator. It generates the actual parsing code.
32  * @todo Investigate whether parts of it are not code-generation, but in fact realy computations which should be handled independently from the output-language.
33  */
34 class CodeGenerator: protected DefaultVisitor
35 {
36 public:
37   QTextStream& out;
38   Model::EvolveItem *mEvolve;
39   QSet<QString> *mNames;
40   Model::SymbolItem *mSym;
41
42 public:
43   CodeGenerator(QTextStream& o, QSet<QString> *names, Model::SymbolItem *sym)
44     : out(o), mNames(names), mSym(sym), mCurrentCatchId(0)
45   {}
46
47   void operator()(Model::Node *node);
48
49 protected:
50   virtual void visitZero(Model::ZeroItem *node);
51   virtual void visitSymbol(Model::SymbolItem *node);
52   virtual void visitNonTerminal(Model::NonTerminalItem *node);
53   virtual void visitTerminal(Model::TerminalItem *node);
54   virtual void visitPlus(Model::PlusItem *node);
55   virtual void visitStar(Model::StarItem *node);
56   virtual void visitAction(Model::ActionItem *node);
57   virtual void visitAlternative(Model::AlternativeItem *node);
58   virtual void visitCons(Model::ConsItem *node);
59   virtual void visitEvolve(Model::EvolveItem *node);
60   virtual void visitTryCatch(Model::TryCatchItem *node);
61   virtual void visitAlias(Model::AliasItem *node);
62   virtual void visitAnnotation(Model::AnnotationItem *node);
63   virtual void visitCondition(Model::ConditionItem *node);
64   virtual void visitOperator(Model::OperatorItem *node);
65
66 private:
67   int mCurrentCatchId;
68   int setCatchId(int catch_id);
69 };
70
71 class GenerateForwardParserRule
72 {
73 public:
74   QTextStream& out;
75
76 public:
77   GenerateForwardParserRule(QTextStream& o): out(o)
78   {}
79
80   void operator()(QPair<QString, Model::SymbolItem*> const &__it);
81 };
82
83 class GenerateParserRule
84 {
85 public:
86   QTextStream& out;
87   QSet<QString> mNames;
88
89 public:
90   GenerateParserRule(QTextStream& o): out(o)
91   {}
92
93   void operator()(QPair<QString, Model::SymbolItem*> const &__it);
94 };
95
96 class GenerateLocalDeclarations: protected DefaultVisitor
97 {
98 public:
99   QTextStream& out;
100   QSet<QString> *mNames;
101
102 public:
103   GenerateLocalDeclarations(QTextStream& o, QSet<QString> *names)
104     : out(o), mNames(names)
105   {}
106
107   void operator()(Model::Node *node);
108   virtual void visitVariableDeclaration(Model::VariableDeclarationItem *node);
109 };
110
111 class GenerateParseMethodSignature: protected DefaultVisitor
112 {
113 public:
114   QTextStream& out;
115   bool firstParameter;
116   QSet<QString> *mNames;
117
118 public:
119   GenerateParseMethodSignature(QTextStream& o, QSet<QString> *names)
120     : out(o), firstParameter(true), mNames(names)
121   {}
122
123   void operator()(Model::SymbolItem *node);
124   virtual void visitVariableDeclaration(Model::VariableDeclarationItem *node);
125 };
126
127 class GenerateRecursiveDelegation
128 {
129 public:
130   QTextStream& out;
131   
132   GenerateRecursiveDelegation(QTextStream& o)
133     : out(o)
134   {}
135   
136   void operator()(Model::SymbolItem *node);
137 };
138
139 template<bool printType, bool printName>
140 class GenerateVariableDeclaration
141 {
142 public:
143   QTextStream& out;
144
145 public:
146   GenerateVariableDeclaration(QTextStream& o): out(o)
147   {}
148
149   void operator()(Model::VariableDeclarationItem *node);
150 };
151
152 class GenerateTokenVariableInitialization : public DefaultVisitor
153 {
154 public:
155   QTextStream& out;
156   GenerateTokenVariableInitialization( QTextStream& o) : out(o)
157   {
158   }
159
160   void operator()(Model::SymbolItem* node);
161   virtual void visitVariableDeclaration(Model::VariableDeclarationItem *node);
162 };
163
164 class GenerateMemberCode
165 {
166 public:
167   QTextStream& out;
168   int mKindMask;
169
170 public:
171   GenerateMemberCode(QTextStream& o, int kind_mask)
172   : out(o), mKindMask(kind_mask)
173   {}
174
175   void operator()(Settings::MemberItem* m);
176 };
177
178 class GenerateParserDeclarations
179 {
180 public:
181   QTextStream& out;
182
183 public:
184   GenerateParserDeclarations(QTextStream& o): out(o)
185   {}
186
187   void operator()();
188 };
189
190 class GenerateParserBits
191 {
192 public:
193   QTextStream& out;
194
195 public:
196   GenerateParserBits(QTextStream& o): out(o)
197   {}
198
199   void operator()();
200 };
201
202 class GenerateTokenTexts
203 {
204 public:
205   QTextStream& out;
206
207 public:
208   GenerateTokenTexts(QTextStream& o): out(o)
209   {}
210
211   void operator()();
212 };
213
214 }
215
216 #endif // KDEV_PG_CODEGEN_H