X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FTokenizer.h;h=864f9d2deab832e68627f724b519b5cc9ee8748e;hb=350055a7ff27c74882aff8a4d6af2014782f830b;hp=b7ca72f664c148c1f92029a27cc132fbdb7682ce;hpb=00dafa489224450ccc0321e238c176b9e8aa34bc;p=l2e.git diff --git a/src/loader/Tokenizer.h b/src/loader/Tokenizer.h index b7ca72f..864f9d2 100644 --- a/src/loader/Tokenizer.h +++ b/src/loader/Tokenizer.h @@ -18,7 +18,8 @@ namespace loader { class Tokenizer { public: - explicit Tokenizer(std::istream &in) : in(in), isPutback(false) { } + explicit Tokenizer(std::istream &in) + : in(in), line(1), isPutback(false), skipComments(true) { } ~Tokenizer() { } private: Tokenizer(const Tokenizer &); @@ -47,6 +48,11 @@ public: KEYWORD_TRUE = 't', IDENTIFIER = 'x', TYPE_NAME = 'n', + COMMENT = 'c', + COMMAND = '$', + REGISTER = '%', + SCRIPT_BEGIN = 's', + SCRIPT_END = 'S', }; Token() : type(UNKNOWN), number(0) { } @@ -60,27 +66,38 @@ public: class LexerError: public std::runtime_error { public: - explicit LexerError(const std::string &msg) : std::runtime_error(msg) { } + LexerError(int line, const std::string &msg) + : std::runtime_error(msg), line(line) { } + int Line() const { return line; } + private: + int line; }; bool HasMore(); Token GetNext(); const Token &Peek(); void Putback(const Token &); + int Line() const { return line; } private: + void ScanSpace(); Token ReadToken(); Token ReadNumber(); Token ReadString(); Token ReadIdentifier(); + Token ReadComment(); + Token ReadMultilineComment(); + bool CheckKeyword(Token &); private: std::istream ∈ Token putback; + int line; bool isPutback; + bool skipComments; }; @@ -98,6 +115,8 @@ inline const char *TokenTypeToString(Tokenizer::Token::Type t) { return "COLON"; case Tokenizer::Token::COMMA: return "COMMA"; + case Tokenizer::Token::COMMAND: + return "COMMAND"; case Tokenizer::Token::BRACKET_OPEN: return "BRACKET_OPEN"; case Tokenizer::Token::BRACKET_CLOSE: @@ -108,6 +127,12 @@ inline const char *TokenTypeToString(Tokenizer::Token::Type t) { return "PARENTHESIS_CLOSE"; case Tokenizer::Token::NUMBER: return "NUMBER"; + case Tokenizer::Token::REGISTER: + return "REGISTER"; + case Tokenizer::Token::SCRIPT_BEGIN: + return "SCRIPT_BEGIN"; + case Tokenizer::Token::SCRIPT_END: + return "SCRIPT_END"; case Tokenizer::Token::STRING: return "STRING"; case Tokenizer::Token::KEYWORD_EXPORT: