00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef PYTHON_TOKENIZER_HH
00020 #define PYTHON_TOKENIZER_HH
00021
00022
00023
00024
00025
00026
00027 #include <ost/gui/module_config.hh>
00028 #include <QString>
00029
00030 namespace ost { namespace gui {
00031
00032 struct DLLEXPORT_OST_GUI Range
00033 {
00034 size_t location, length;
00035
00036 Range(size_t loc, size_t len):
00037 location(loc),
00038 length(len)
00039 {
00040 }
00041
00042 Range():
00043 location(-1),
00044 length(0)
00045 {
00046 }
00047
00048 size_t End() const
00049 {
00050 return location+length;
00051 }
00052 };
00053
00054 class DLLEXPORT_OST_GUI PythonToken
00055 {
00056 public:
00057 enum Type {
00058 KEYWORD,
00059 STRING_LITERAL,
00060 STRING_DELIM,
00061 IDENTIFIER,
00062 NUMBER,
00063 OPERATOR,
00064 GROUPING,
00065 COMMENT,
00066 END
00067 };
00068 PythonToken();
00069 PythonToken(Type type,const Range& range, const QString& value);
00070 Type GetType() const;
00071 QString GetTypeAsString() const;
00072 const QString& GetValue() const;
00073 const Range& GetRange() const;
00074
00075 private:
00076 Type type_;
00077 Range range_;
00078 QString value_;
00079 };
00080
00081 class DLLEXPORT_OST_GUI PythonTokenizer
00082 {
00083 public:
00084 PythonTokenizer();
00085 PythonTokenizer(const QString& command, int string_state=0);
00086 void SetCommand(const QString& command);
00087 PythonToken NextToken();
00088 const PythonToken& CurrentToken() const;
00089 void SetInString(bool in_string);
00090 bool InString() const { return in_string_; }
00091 const QString& GetDelim() const { return string_delim_; }
00092 private:
00093 void EatWhities();
00094 QString GetSubString(const Range& range);
00095 PythonToken GetIdentifierSeq();
00096 PythonToken GetNumberToken();
00097 PythonToken GetKeywordToken();
00098 PythonToken GetOperatorToken();
00099 PythonToken GetGroupingToken();
00100 PythonToken GetStringLiteral();
00101 PythonToken GetStringDelim();
00102 QString command_;
00103 int current_pos_;
00104 bool in_string_;
00105 QString string_delim_;
00106 PythonToken current_token_;
00107 };
00108
00109
00110 }}
00111
00112 #endif