2
Copyright 2008 Hamish Rodda <rodda@kde.org>
4
This library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Library General Public
6
License version 2 as published by the Free Software Foundation.
8
This library is distributed in the hope that it will be useful,
9
but WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
Library General Public License for more details.
13
You should have received a copy of the GNU Library General Public License
14
along with this library; see the file COPYING.LIB. If not, write to
15
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16
Boston, MA 02110-1301, USA.
19
#ifndef CODEGENERATOR_H
20
#define CODEGENERATOR_H
22
#include <QTextStream>
25
#include "default_visitor.h"
29
class KDEVCPPPARSER_EXPORT CodeGenerator : public DefaultVisitor
32
CodeGenerator(ParseSession* session);
33
virtual ~CodeGenerator();
38
virtual void visitAccessSpecifier (AccessSpecifierAST*);
39
virtual void visitAsmDefinition (AsmDefinitionAST*);
40
virtual void visitBaseClause (BaseClauseAST*);
41
virtual void visitBaseSpecifier (BaseSpecifierAST*);
42
virtual void visitBinaryExpression (BinaryExpressionAST*);
43
virtual void visitCastExpression (CastExpressionAST*);
44
virtual void visitClassMemberAccess (ClassMemberAccessAST*);
45
virtual void visitClassSpecifier (ClassSpecifierAST*);
46
virtual void visitCompoundStatement (CompoundStatementAST*);
47
virtual void visitCondition (ConditionAST*);
48
virtual void visitConditionalExpression (ConditionalExpressionAST*);
49
virtual void visitCppCastExpression (CppCastExpressionAST*);
50
virtual void visitCtorInitializer (CtorInitializerAST*);
51
virtual void visitDeclarationStatement (DeclarationStatementAST*);
52
virtual void visitDeclarator (DeclaratorAST*);
53
virtual void visitDeleteExpression (DeleteExpressionAST*);
54
virtual void visitDoStatement (DoStatementAST*);
55
virtual void visitElaboratedTypeSpecifier (ElaboratedTypeSpecifierAST*);
56
virtual void visitEnumSpecifier (EnumSpecifierAST*);
57
virtual void visitEnumerator (EnumeratorAST*);
58
virtual void visitExceptionSpecification (ExceptionSpecificationAST*);
59
virtual void visitExpressionOrDeclarationStatement (ExpressionOrDeclarationStatementAST*);
60
virtual void visitExpressionStatement (ExpressionStatementAST*);
61
virtual void visitForStatement (ForStatementAST*);
62
virtual void visitFunctionCall (FunctionCallAST*);
63
virtual void visitFunctionDefinition (FunctionDefinitionAST*);
64
virtual void visitIfStatement (IfStatementAST*);
65
virtual void visitIncrDecrExpression (IncrDecrExpressionAST*);
66
virtual void visitInitDeclarator (InitDeclaratorAST*);
67
virtual void visitInitializer (InitializerAST*);
68
virtual void visitInitializerClause (InitializerClauseAST*);
69
virtual void visitJumpStatement (JumpStatementAST*);
70
virtual void visitLabeledStatement (LabeledStatementAST*);
71
virtual void visitLinkageBody (LinkageBodyAST*);
72
virtual void visitLinkageSpecification (LinkageSpecificationAST*);
73
virtual void visitMemInitializer (MemInitializerAST*);
74
virtual void visitName (NameAST*);
75
virtual void visitNamespace (NamespaceAST*);
76
virtual void visitNamespaceAliasDefinition (NamespaceAliasDefinitionAST*);
77
virtual void visitNewDeclarator (NewDeclaratorAST*);
78
virtual void visitNewExpression (NewExpressionAST*);
79
virtual void visitNewInitializer (NewInitializerAST*);
80
virtual void visitNewTypeId (NewTypeIdAST*);
81
virtual void visitOperator (OperatorAST*);
82
virtual void visitOperatorFunctionId (OperatorFunctionIdAST*);
83
virtual void visitParameterDeclaration (ParameterDeclarationAST*);
84
virtual void visitParameterDeclarationClause (ParameterDeclarationClauseAST*);
85
virtual void visitPostfixExpression (PostfixExpressionAST*);
86
virtual void visitPrimaryExpression (PrimaryExpressionAST*);
87
virtual void visitPtrOperator (PtrOperatorAST*);
88
virtual void visitPtrToMember (PtrToMemberAST*);
89
virtual void visitReturnStatement (ReturnStatementAST*);
90
virtual void visitSimpleDeclaration (SimpleDeclarationAST*);
91
virtual void visitSimpleTypeSpecifier (SimpleTypeSpecifierAST*);
92
virtual void visitSizeofExpression (SizeofExpressionAST*);
93
virtual void visitStringLiteral (StringLiteralAST*);
94
virtual void visitSubscriptExpression (SubscriptExpressionAST*);
95
virtual void visitSwitchStatement (SwitchStatementAST*);
96
virtual void visitTemplateArgument (TemplateArgumentAST*);
97
virtual void visitTemplateDeclaration (TemplateDeclarationAST*);
98
virtual void visitTemplateParameter (TemplateParameterAST*);
99
virtual void visitThrowExpression (ThrowExpressionAST*);
100
virtual void visitTranslationUnit (TranslationUnitAST*);
101
virtual void visitTryBlockStatement (TryBlockStatementAST*);
102
virtual void visitCatchStatement (CatchStatementAST*);
103
virtual void visitTypeId (TypeIdAST*);
104
virtual void visitTypeIdentification (TypeIdentificationAST*);
105
virtual void visitTypeParameter (TypeParameterAST*);
106
virtual void visitTypedef (TypedefAST*);
107
virtual void visitUnaryExpression (UnaryExpressionAST*);
108
virtual void visitUnqualifiedName (UnqualifiedNameAST*);
109
virtual void visitUsing (UsingAST*);
110
virtual void visitUsingDirective (UsingDirectiveAST*);
111
virtual void visitWhileStatement (WhileStatementAST*);
112
virtual void visitWinDeclSpec (WinDeclSpecAST*);
115
void outputToken(std::size_t tokenPosition);
117
void print(const ListNode<std::size_t>* tokenList, bool followingSpace = false);
118
void print(std::size_t token, bool followingSpace = false);
119
void printToken(int token, bool followingSpace = false);
121
template <class AstNode>
122
void visitCommaPrint(const ListNode<AstNode>* list)
124
const ListNode<AstNode>* it = list->toFront(), *end = it;
127
if (first) first = false; else m_output << ",";
134
void commaPrintNodes(Visitor *v, const ListNode<_Tp> *nodes, const QString& separator = QString(","))
140
*it = nodes->toFront(),
147
if (first) first = false; else m_output << separator;
148
v->visit(it->element);
155
void surroundPrintNodes(Visitor *v, const ListNode<_Tp> *nodes, const QString& separatorLeft, const QString& separatorRight)
161
*it = nodes->toFront(),
166
m_output << separatorLeft;
167
v->visit(it->element);
168
m_output << separatorRight;
174
QString m_outputString;
175
QTextStream m_output;
176
ParseSession* m_session;
179
#endif // CODEGENERATOR_H