X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FTokenizer.h;h=b7ca72f664c148c1f92029a27cc132fbdb7682ce;hb=00dafa489224450ccc0321e238c176b9e8aa34bc;hp=f363af70bd0169684a247c3bb45262b6dbe6542a;hpb=93971b3ba23e6b51319b07d7d82dcbcf976f8b9a;p=l2e.git diff --git a/src/loader/Tokenizer.h b/src/loader/Tokenizer.h index f363af7..b7ca72f 100644 --- a/src/loader/Tokenizer.h +++ b/src/loader/Tokenizer.h @@ -9,6 +9,8 @@ #define LOADER_TOKENIZER_H_ #include +#include +#include #include namespace loader { @@ -16,7 +18,7 @@ namespace loader { class Tokenizer { public: - Tokenizer(std::istream &in) : in(in), isPutback(false) { } + explicit Tokenizer(std::istream &in) : in(in), isPutback(false) { } ~Tokenizer() { } private: Tokenizer(const Tokenizer &); @@ -26,7 +28,7 @@ public: struct Token { enum Type { - UNKNOWN, + UNKNOWN = 0, ANGLE_BRACKET_OPEN = '{', ANGLE_BRACKET_CLOSE = '}', CHEVRON_OPEN = '<', @@ -35,18 +37,20 @@ public: COMMA = ',', BRACKET_OPEN = '[', BRACKET_CLOSE = ']', - NUMBER, - STRING, - KEYWORD_EXPORT, - KEYWORD_FALSE, - KEYWORD_INCLUDE, - KEYWORD_TRUE, - IDENTIFIER, - TYPE_NAME, + PARENTHESIS_OPEN = '(', + PARENTHESIS_CLOSE = ')', + NUMBER = '0', + STRING = '"', + KEYWORD_EXPORT = 'e', + KEYWORD_FALSE = 'f', + KEYWORD_INCLUDE = 'i', + KEYWORD_TRUE = 't', + IDENTIFIER = 'x', + TYPE_NAME = 'n', }; Token() : type(UNKNOWN), number(0) { } - Token(Type t) : type(t), number(0) { } + explicit Token(Type t) : type(t), number(0) { } Type type; std::string str; @@ -54,8 +58,14 @@ public: }; + class LexerError: public std::runtime_error { + public: + explicit LexerError(const std::string &msg) : std::runtime_error(msg) { } + }; + bool HasMore(); Token GetNext(); + const Token &Peek(); void Putback(const Token &); private: @@ -74,6 +84,54 @@ private: }; +inline const char *TokenTypeToString(Tokenizer::Token::Type t) { + switch (t) { + case Tokenizer::Token::ANGLE_BRACKET_OPEN: + return "ANGLE_BRACKET_OPEN"; + case Tokenizer::Token::ANGLE_BRACKET_CLOSE: + return "ANGLE_BRACKET_CLOSE"; + case Tokenizer::Token::CHEVRON_OPEN: + return "CHEVRON_OPEN"; + case Tokenizer::Token::CHEVRON_CLOSE: + return "CHEVRON_CLOSE"; + case Tokenizer::Token::COLON: + return "COLON"; + case Tokenizer::Token::COMMA: + return "COMMA"; + case Tokenizer::Token::BRACKET_OPEN: + return "BRACKET_OPEN"; + case Tokenizer::Token::BRACKET_CLOSE: + return "BRACKET_CLOSE"; + case Tokenizer::Token::PARENTHESIS_OPEN: + return "PARENTHESIS_OPEN"; + case Tokenizer::Token::PARENTHESIS_CLOSE: + return "PARENTHESIS_CLOSE"; + case Tokenizer::Token::NUMBER: + return "NUMBER"; + case Tokenizer::Token::STRING: + return "STRING"; + case Tokenizer::Token::KEYWORD_EXPORT: + return "KEYWORD_EXPORT"; + case Tokenizer::Token::KEYWORD_FALSE: + return "KEYWORD_FALSE"; + case Tokenizer::Token::KEYWORD_INCLUDE: + return "KEYWORD_INCLUDE"; + case Tokenizer::Token::KEYWORD_TRUE: + return "KEYWORD_TRUE"; + case Tokenizer::Token::IDENTIFIER: + return "IDENTIFIER"; + case Tokenizer::Token::TYPE_NAME: + return "TYPE_NAME"; + default: + return "UNKNOWN"; + } +} + +inline std::ostream &operator <<(std::ostream &out, Tokenizer::Token::Type t) { + out << TokenTypeToString(t); + return out; +} + } #endif /* LOADER_TOKENIZER_H_ */