00001
00002
00003
00004
00005
00006 #ifndef FITYK__LEXER__H__
00007 #define FITYK__LEXER__H__
00008
00009 #include <string>
00010
00011 class VMData;
00012
00013 #ifdef _WIN32
00014
00015 #define TokenType FitykTokenType
00016 #endif
00017
00018 enum TokenType
00019 {
00020
00021 kTokenLname,
00022 kTokenCname,
00023 kTokenUletter,
00024 kTokenString,
00025 kTokenVarname,
00026 kTokenFuncname,
00027
00028
00029
00030
00031 kTokenFilename,
00032
00033 kTokenExpr,
00034
00035
00036 kTokenEVar,
00037
00038 kTokenRest,
00039
00040
00041 kTokenNumber,
00042 kTokenDataset,
00043
00044
00045 kTokenLE, kTokenGE,
00046 kTokenNE,
00047 kTokenEQ,
00048 kTokenAppend,
00049 kTokenDots,
00050 kTokenPlusMinus,
00051 kTokenAddAssign, kTokenSubAssign,
00052
00053
00054 kTokenOpen, kTokenClose,
00055 kTokenLSquare, kTokenRSquare,
00056 kTokenLCurly, kTokenRCurly,
00057 kTokenPlus, kTokenMinus,
00058 kTokenMult, kTokenDiv,
00059 kTokenPower,
00060 kTokenLT, kTokenGT,
00061 kTokenAssign,
00062 kTokenComma, kTokenSemicolon,
00063 kTokenDot,
00064 kTokenColon,
00065 kTokenTilde,
00066 kTokenQMark,
00067 kTokenBang,
00068
00069 kTokenNop,
00070 };
00071
00072 const char* tokentype2str(TokenType tt);
00073
00074
00075 struct Token
00076 {
00077 const char* str;
00078 TokenType type;
00079 short length;
00080
00081 union
00082 {
00083 int i;
00084 double d;
00085 } value;
00086
00087
00088 std::string as_string() const { return std::string(str, length); }
00089 };
00090
00091 class Lexer
00092 {
00093 public:
00094
00095 enum { kAll = -1, kNew = -2 };
00096
00097
00098
00099
00100 static std::string get_string(const Token& token);
00101
00102 Lexer(const char* input)
00103 : input_(input), cur_(input), peeked_(false) {}
00104
00105 Token get_token();
00106
00107
00108 const Token& peek_token();
00109
00110 Token get_expected_token(TokenType tt);
00111 Token get_expected_token(const std::string& raw);
00112 Token get_expected_token(TokenType tt1, TokenType tt2);
00113 Token get_expected_token(TokenType tt, const std::string& raw);
00114 Token get_expected_token(const std::string& raw1, const std::string& raw2);
00115
00116
00117 Token get_token_if(TokenType tt);
00118
00119 bool discard_token_if(TokenType tt)
00120 { return get_token_if(tt).type != kTokenNop; }
00121
00122
00123 Token get_glob_token();
00124
00125
00126
00127
00128 Token get_filename_token();
00129
00130
00131 Token get_rest_of_line();
00132
00133 void go_back(const Token& token);
00134
00135 void throw_syntax_error(const std::string& msg="");
00136
00137 const char* pchar() const { return peeked_ ? tok_.str : cur_; }
00138 int scanned_chars() const { return pchar() - input_; }
00139
00140 private:
00141 void read_token(bool allow_glob=false);
00142
00143 const char* const input_;
00144 const char* cur_;
00145 bool peeked_;
00146 Token tok_;
00147 };
00148
00149 std::string token2str(const Token& token);
00150
00151 #endif // FITYK__LEXER__H__