X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FTokenizer.h;h=06103b7d8b6f41378a32839405f1d58df4964755;hb=c5e56f45e08fcc6c4dceb586ce3d671a3f3907ab;hp=15eadf8710e20b4d42ed550ad9b72f7697d3e2e7;hpb=996552758ec3bc748081b65b26b4a61bcd619324;p=l2e.git diff --git a/src/loader/Tokenizer.h b/src/loader/Tokenizer.h index 15eadf8..06103b7 100644 --- a/src/loader/Tokenizer.h +++ b/src/loader/Tokenizer.h @@ -1,15 +1,9 @@ -/* - * Tokenizer.h - * - * Created on: Aug 26, 2012 - * Author: holy - */ - #ifndef LOADER_TOKENIZER_H_ #define LOADER_TOKENIZER_H_ #include #include +#include #include namespace loader { @@ -17,7 +11,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 &); @@ -27,7 +22,7 @@ public: struct Token { enum Type { - UNKNOWN, + UNKNOWN = 0, ANGLE_BRACKET_OPEN = '{', ANGLE_BRACKET_CLOSE = '}', CHEVRON_OPEN = '<', @@ -36,14 +31,21 @@ 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', + COMMENT = 'c', + COMMAND = '$', + REGISTER = '%', + SCRIPT_BEGIN = 's', + SCRIPT_END = 'S', }; Token() : type(UNKNOWN), number(0) { } @@ -55,23 +57,40 @@ public: }; + class LexerError: public std::runtime_error { + public: + 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; }; @@ -89,12 +108,24 @@ 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: 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::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: