]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/Tokenizer.cpp
added basic parser (not completely tested)
[l2e.git] / src / loader / Tokenizer.cpp
index 76a3a14e5fc67b3a8c10f9706ed30d84af6863ec..cdabe01eed9b8a07c654a2cd068620b953e3f3f9 100644 (file)
@@ -8,23 +8,30 @@
 #include "Tokenizer.h"
 
 #include <istream>
-#include <stdexcept>
 
 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)) {