X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FTokenizer.cpp;h=cdabe01eed9b8a07c654a2cd068620b953e3f3f9;hb=af9e0b57dac45dc5591f16fb34236b1356cda8a2;hp=76a3a14e5fc67b3a8c10f9706ed30d84af6863ec;hpb=996552758ec3bc748081b65b26b4a61bcd619324;p=l2e.git diff --git a/src/loader/Tokenizer.cpp b/src/loader/Tokenizer.cpp index 76a3a14..cdabe01 100644 --- a/src/loader/Tokenizer.cpp +++ b/src/loader/Tokenizer.cpp @@ -8,23 +8,30 @@ #include "Tokenizer.h" #include -#include namespace loader { bool Tokenizer::HasMore() { - return in; + return std::istream::sentry(in); } void Tokenizer::Putback(const Token &t) { if (isPutback) { - throw std::runtime_error("Tokenizer: double putback not supported"); + throw LexerError("Tokenizer: double putback not supported"); } else { putback = t; isPutback = true; } } +const Tokenizer::Token &Tokenizer::Peek() { + if (!isPutback) { + putback = GetNext(); + isPutback = true; + } + return putback; +} + Tokenizer::Token Tokenizer::GetNext() { if (isPutback) { isPutback = false; @@ -47,6 +54,8 @@ Tokenizer::Token Tokenizer::ReadToken() { case Token::COMMA: case Token::BRACKET_OPEN: case Token::BRACKET_CLOSE: + case Token::PARENTHESIS_OPEN: + case Token::PARENTHESIS_CLOSE: return Token ((Token::Type) c); case '+': case '-': case '0': case '1': case '2': case '3': case '4': @@ -65,7 +74,7 @@ Tokenizer::Token Tokenizer::ReadToken() { } else if (std::islower(c)) { CheckKeyword(t); } else { - throw std::runtime_error(std::string("Tokenizer: cannot parse token: ") + c); + throw LexerError(std::string("Tokenizer: cannot parse token: ") + c); } return t; } @@ -105,7 +114,7 @@ Tokenizer::Token Tokenizer::ReadString() { std::istream::char_type c; in.get(c); if (c != '"') { - throw std::runtime_error("Tokenizer: strings must begin with '\"'"); + throw LexerError("Tokenizer: strings must begin with '\"'"); } while (in.get(c)) {