summaryrefslogtreecommitdiff
path: root/tools/standalone_miri/lex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/standalone_miri/lex.cpp')
-rw-r--r--tools/standalone_miri/lex.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/tools/standalone_miri/lex.cpp b/tools/standalone_miri/lex.cpp
index 48a9e0cd..8fc77f7a 100644
--- a/tools/standalone_miri/lex.cpp
+++ b/tools/standalone_miri/lex.cpp
@@ -11,11 +11,11 @@ bool Token::operator==(TokenClass tc) const
}
bool Token::operator==(char c) const
{
- return this->strval.size() == 1 && this->strval[0] == c;
+ return (this->type == TokenClass::Ident || this->type == TokenClass::Symbol) && this->strval.size() == 1 && this->strval[0] == c;
}
bool Token::operator==(const char* s) const
{
- return this->strval == s;
+ return (this->type == TokenClass::Ident || this->type == TokenClass::Symbol) && this->strval == s;
}
uint64_t Token::integer() const
@@ -56,6 +56,9 @@ double Token::real() const
case TokenClass::ByteString:
os << "b\"" << x.strval << "\"";
break;
+ case TokenClass::Lifetime:
+ os << "'" << x.strval << "\"";
+ break;
}
return os;
}
@@ -95,6 +98,7 @@ Token Lexer::consume()
auto rv = ::std::move(m_cur);
advance();
+ //::std::cout << *this << "Lexer::consume " << rv << " -> " << m_cur << ::std::endl;
return rv;
}
@@ -349,6 +353,23 @@ void Lexer::advance()
auto val = this->parse_string();
m_cur = Token { TokenClass::String, ::std::move(val) };
}
+ else if( ch == '\'')
+ {
+ ::std::string val;
+ ch = m_if.get();
+ while( ch == '_' || ::std::isalnum(ch) )
+ {
+ val += ch;
+ ch = m_if.get();
+ }
+ m_if.unget();
+ if( val == "" )
+ {
+ ::std::cerr << *this << "Empty lifetime name";
+ throw "ERROR";
+ }
+ m_cur = Token { TokenClass::Lifetime, ::std::move(val) };
+ }
else
{
switch(ch)
@@ -390,6 +411,10 @@ void Lexer::advance()
{
m_cur = Token { TokenClass::Symbol, "<<" };
}
+ else if( ch == '=' )
+ {
+ m_cur = Token { TokenClass::Symbol, "<=" };
+ }
else
{
m_if.unget();