Compare commits

..

2 Commits

Author SHA1 Message Date
Michael Ochmann 2686964d3e fixes and improvements: 3 years ago
Michael Ochmann e45abf48ba fixed additional comsumption of token if operator 3 years ago
  1. 23
      src/Lexer.cpp
  2. 4
      src/Lexer.hpp

@ -18,6 +18,8 @@ namespace dumb {
"OPERATOR_COLON", "OPERATOR_COLON",
"OPERATOR_ARROW", "OPERATOR_ARROW",
"OPERATOR_DOUBLE_COLON", "OPERATOR_DOUBLE_COLON",
"OPERATOR_AMPERSAND",
"OPERATOR_PIPE",
"INTEGER_LITERAL", "INTEGER_LITERAL",
"FLOAT_LITERAL", "FLOAT_LITERAL",
"STRING_LITERAL", "STRING_LITERAL",
@ -63,7 +65,9 @@ namespace dumb {
{"*", Token::Type::OPERATOR_ASTERISK}, {"*", Token::Type::OPERATOR_ASTERISK},
{"=", Token::Type::OPERATOR_EQUALS}, {"=", Token::Type::OPERATOR_EQUALS},
{":", Token::Type::OPERATOR_COLON}, {":", Token::Type::OPERATOR_COLON},
{".", Token::Type::OPERATOR_DOT} {".", Token::Type::OPERATOR_DOT},
{"&", Token::Type::OPERATOR_AMPERSAND},
{"|", Token::Type::OPERATOR_PIPE}
}; };
dumb::Lexer::Lexer(Compiler& compiler, std::filesystem::path sourceFile) : compiler(compiler), line(1), column(1), pointer(0) { dumb::Lexer::Lexer(Compiler& compiler, std::filesystem::path sourceFile) : compiler(compiler), line(1), column(1), pointer(0) {
@ -203,7 +207,6 @@ namespace dumb {
this->tokenStream.emplace_back(type, "", this->line, this->column); this->tokenStream.emplace_back(type, "", this->line, this->column);
this->consume();
} }
void Lexer::readStringLiteral() { void Lexer::readStringLiteral() {
@ -253,20 +256,28 @@ namespace dumb {
size_t value; size_t value;
switch (kind) { switch (kind) {
case 'x': case 'x': {
while (std::isdigit(this->current()) || (this->current() >= 'A' && this->current() <= 'F') || (this->current() >= 'a' && this->current() <= 'f')) while (std::isdigit(this->current()) || (this->current() >= 'A' && this->current() <= 'F') || (this->current() >= 'a' && this->current() <= 'f'))
this->buffer << this->consume(); this->buffer << this->consume();
value = std::stoi(this->buffer.str(), nullptr, 16); std::string stringValue(this->buffer.str());
value = stringValue.length() > 0 ? std::stoi(stringValue, nullptr, 16) : 0;
break; break;
case 'b': }
case 'b': {
while (this->current() == '0' || this->current() == '1') while (this->current() == '0' || this->current() == '1')
this->buffer << this->consume(); this->buffer << this->consume();
value = std::stoi(this->buffer.str(), nullptr, 2); std::string stringValue(this->buffer.str());
value = stringValue.length() > 0 ? std::stoi(stringValue, nullptr, 2) : 0;
break; break;
}
default: default:
std::cout << "Unexpected token '" << this->current() << "' on line " << this->line << " column " << this->column << std::endl; std::cout << "Unexpected token '" << this->current() << "' on line " << this->line << " column " << this->column << std::endl;
exit(1); exit(1);
} }
if (std::isalnum(this->current())) {
std::cout << "Unexpected token '" << this->current() << "' on line " << this->line << " column " << this->column << std::endl;
exit(1);
}
this->tokenStream.emplace_back(Token::Type::INTEGER_LITERAL, std::to_string(value), line, column); this->tokenStream.emplace_back(Token::Type::INTEGER_LITERAL, std::to_string(value), line, column);
this->resetBuffer(); this->resetBuffer();
} }

@ -22,6 +22,8 @@ namespace dumb {
OPERATOR_COLON, OPERATOR_COLON,
OPERATOR_ARROW, OPERATOR_ARROW,
OPERATOR_DOUBLE_COLON, OPERATOR_DOUBLE_COLON,
OPERATOR_AMPERSAND,
OPERATOR_PIPE,
INTEGER_LITERAL, INTEGER_LITERAL,
FLOAT_LITERAL, FLOAT_LITERAL,
STRING_LITERAL, STRING_LITERAL,
@ -95,6 +97,8 @@ namespace dumb {
case '=': case '=':
case ':': case ':':
case '.': case '.':
case '&':
case '|':
return true; return true;
default: default:
return false; return false;

Loading…
Cancel
Save