説明を見る。00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef V8_PRETTYPRINTER_H_
00029 #define V8_PRETTYPRINTER_H_
00030
00031 #include "ast.h"
00032
00033 namespace v8 { namespace internal {
00034
00035 #ifdef DEBUG
00036
00037 class PrettyPrinter: public Visitor {
00038 public:
00039 PrettyPrinter();
00040 virtual ~PrettyPrinter();
00041
00042
00043
00044 const char* Print(Node* node);
00045 const char* PrintExpression(FunctionLiteral* program);
00046 const char* PrintProgram(FunctionLiteral* program);
00047
00048
00049 static void PrintOut(Node* node);
00050
00051
00052 #define DEF_VISIT(type) \
00053 virtual void Visit##type(type* node);
00054 NODE_LIST(DEF_VISIT)
00055 #undef DEF_VISIT
00056
00057 private:
00058 char* output_;
00059 int size_;
00060 int pos_;
00061
00062 protected:
00063 void Init();
00064 void Print(const char* format, ...);
00065 const char* Output() const { return output_; }
00066
00067 virtual void PrintStatements(ZoneList<Statement*>* statements);
00068 void PrintLabels(ZoneStringList* labels);
00069 virtual void PrintArguments(ZoneList<Expression*>* arguments);
00070 void PrintLiteral(Handle<Object> value, bool quote);
00071 void PrintParameters(Scope* scope);
00072 void PrintDeclarations(ZoneList<Declaration*>* declarations);
00073 void PrintFunctionLiteral(FunctionLiteral* function);
00074 void PrintCaseClause(CaseClause* clause);
00075 };
00076
00077
00078
00079 class AstPrinter: public PrettyPrinter {
00080 public:
00081 AstPrinter();
00082 virtual ~AstPrinter();
00083
00084 const char* PrintProgram(FunctionLiteral* program);
00085
00086
00087 #define DEF_VISIT(type) \
00088 virtual void Visit##type(type* node);
00089 NODE_LIST(DEF_VISIT)
00090 #undef DEF_VISIT
00091 private:
00092 friend class IndentedScope;
00093 void PrintIndented(const char* txt);
00094 void PrintIndentedVisit(const char* s, Node* node);
00095
00096 void PrintStatements(ZoneList<Statement*>* statements);
00097 void PrintDeclarations(ZoneList<Declaration*>* declarations);
00098 void PrintParameters(Scope* scope);
00099 void PrintArguments(ZoneList<Expression*>* arguments);
00100 void PrintCaseClause(CaseClause* clause);
00101 void PrintLiteralIndented(const char* info, Handle<Object> value, bool quote);
00102 void PrintLiteralWithModeIndented(const char* info,
00103 Variable* var,
00104 Handle<Object> value,
00105 StaticType* type);
00106 void PrintLabelsIndented(const char* info, ZoneStringList* labels);
00107
00108 void inc_indent() { indent_++; }
00109 void dec_indent() { indent_--; }
00110
00111 static int indent_;
00112 };
00113
00114 #endif // DEBUG
00115
00116 } }
00117
00118 #endif // V8_PRETTYPRINTER_H_