summaryrefslogtreecommitdiff
path: root/src/parse/lex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse/lex.cpp')
-rw-r--r--src/parse/lex.cpp45
1 files changed, 42 insertions, 3 deletions
diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp
index fc2c7401..b290b3f1 100644
--- a/src/parse/lex.cpp
+++ b/src/parse/lex.cpp
@@ -76,8 +76,8 @@ static const struct {
TOKENT("==", TOK_DOUBLE_EQUAL),
TOKENT("=>", TOK_FATARROW),
TOKENT(">", TOK_GT),
- TOKENT(">>", TOK_DOUBLE_GT),
TOKENT(">=", TOK_GTE),
+ TOKENT(">>", TOK_DOUBLE_GT),
TOKENT("?", TOK_QMARK),
TOKENT("@", TOK_AT),
// A-Z :: Elsewhere
@@ -678,6 +678,13 @@ Token TokenStream::getToken()
m_cache_valid = false;
return m_cache;
}
+ else if( m_lookahead.size() )
+ {
+ Token ret = m_lookahead.front();
+ m_lookahead.erase(m_lookahead.begin());
+ ::std::cout << "getToken[" << typeid(*this).name() << "] - " << ret << ::std::endl;
+ return ret;
+ }
else
{
Token ret = this->realGetToken();
@@ -687,6 +694,38 @@ Token TokenStream::getToken()
}
void TokenStream::putback(Token tok)
{
- m_cache_valid = true;
- m_cache = tok;
+ if( m_cache_valid )
+ {
+ DEBUG("" << getPosition());
+ throw ParseError::BugCheck("Double putback");
+ }
+ else
+ {
+ m_cache_valid = true;
+ m_cache = tok;
+ }
}
+
+eTokenType TokenStream::lookahead(unsigned int i)
+{
+ const unsigned int MAX_LOOKAHEAD = 3;
+
+ if( m_cache_valid )
+ {
+ if( i == 0 )
+ return m_cache.type();
+ i --;
+ }
+
+ if( i >= MAX_LOOKAHEAD )
+ throw ParseError::BugCheck("Excessive lookahead");
+
+ while( i >= m_lookahead.size() )
+ {
+ DEBUG("lookahead - read #" << m_lookahead.size());
+ m_lookahead.push_back( this->realGetToken() );
+ }
+
+ return m_lookahead[i].type();
+}
+