00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef PYTHON_CONTEXT_PARSER_HH
00020 #define PYTHON_CONTEXT_PARSER_HH
00021
00022
00023
00024
00025
00026 #include "python_tokenizer.hh"
00027 #include <vector>
00028 #include <iostream>
00029
00030
00031 namespace ost { namespace gui {
00032
00033 class DLLEXPORT_OST_GUI PythonContext
00034 {
00035 public:
00036 PythonContext()
00037 : parent_(NULL)
00038 { }
00039
00040 ~PythonContext()
00041 { this->Clear(); }
00042
00043 bool IsRoot() const
00044 {
00045 return parent_ == NULL;
00046 }
00047
00048 const Range& GetRange() const
00049 { return range_; }
00050
00051 const std::vector<PythonContext*>& GetSubContexts() const
00052 { return sub_contexts_; }
00053
00054 void SetRange( const Range& range)
00055 { range_ = range; }
00056
00057 const PythonContext* GetParent() const
00058 { return parent_; }
00059
00060 void AddToken(const PythonToken& token)
00061 {
00062 range_.length = token.GetRange().End()-range_.location;
00063 token_list_.push_back(token);
00064 }
00065
00066 void Print()
00067 {
00068 for (size_t i = 0; i < token_list_.size(); ++i) {
00069 std::cout << token_list_[i].GetValue().toStdString() << std::endl;
00070 }
00071 }
00072
00073 bool FindLastToken(PythonToken::Type type,
00074 const QString& value,
00075 PythonToken& token);
00076
00077 bool FindFirstToken(PythonToken::Type type,
00078 const QString& value,
00079 PythonToken& token);
00080
00081 void AddContext(PythonContext* context)
00082 {
00083 sub_contexts_.push_back(context);
00084 sub_contexts_.back()->parent_ = this;
00085 }
00086
00087 bool GetContextAtLocation(size_t location, PythonContext*& context);
00088
00089 void Clear();
00090 private:
00091
00092 Range range_;
00093 std::vector<PythonContext*> sub_contexts_;
00094 PythonContext* parent_;
00095 std::vector<PythonToken> token_list_;
00096 };
00097
00098 class DLLEXPORT_OST_GUI PythonContextParser
00099 {
00100 public:
00101 PythonContextParser();
00102
00103 ~PythonContextParser()
00104 {
00105 delete root_;
00106 }
00107
00108 void Print()
00109 {
00110 this->PrintRecursively(root_,0);
00111 }
00112
00113 void Parse(const QString& command);
00114
00115 const QString& GetCommand() const
00116 { return command_; }
00117
00118 bool GetContextAtLocation(size_t location,
00119 PythonContext*& context)
00120 {
00121 return root_->GetContextAtLocation(location,context);
00122 }
00123
00124 protected:
00125 void Parse(PythonContext*& context);
00126
00127
00128
00129 private:
00130 void PrintRecursively(const PythonContext* context, int level)
00131 {
00132 typedef std::vector<PythonContext*>::const_iterator const_it;
00133 if (context->GetRange().length > 0) {
00134 for (int j = 0; j < level; ++j)
00135 std::cout<< "-" ;
00136 try {
00137 std::cout << command_.mid(context->GetRange().location,
00138 context->GetRange().length).toStdString()
00139 << std::endl;;
00140 } catch(...) { }
00141 }
00142
00143 const_it i = context->GetSubContexts().begin();
00144 for (;i!=context->GetSubContexts().end(); ++i) {
00145 this->PrintRecursively(*i,level+1);
00146 }
00147 }
00148 QString command_;
00149 PythonTokenizer tokenizer_;
00150 PythonContext* root_;
00151 };
00152
00153 }}
00154 #endif