Binary literals

This commit is contained in:
Rafał Grodziński
2025-06-22 13:24:17 +09:00
parent 1ac2db1319
commit 47293b4cf5
5 changed files with 44 additions and 0 deletions

View File

@@ -216,6 +216,9 @@ shared_ptr<Token> Lexer::nextToken() {
if (token != nullptr)
return token;
token = matchIntegerBin();
if (token != nullptr)
return token;
// type
token = match(TokenKind::TYPE, "bool", true);
@@ -302,6 +305,28 @@ shared_ptr<Token> Lexer::matchIntegerHex() {
return token;
}
shared_ptr<Token> Lexer::matchIntegerBin() {
int nextIndex = currentIndex;
// match 0b
if (nextIndex > source.length()-2)
return nullptr;
if (source.at(nextIndex++) != '0' || source.at(nextIndex++) != 'b')
return nullptr;
while (nextIndex < source.length() && isBinDigit(nextIndex))
nextIndex++;
if (nextIndex == currentIndex || !isSeparator(nextIndex))
return nullptr;
string lexme = source.substr(currentIndex, nextIndex - currentIndex);
shared_ptr<Token> token = make_shared<Token>(TokenKind::INTEGER_BIN, lexme, currentLine, currentColumn);
advanceWithToken(token);
return token;
}
shared_ptr<Token> Lexer::matchReal() {
int nextIndex = currentIndex;
@@ -366,6 +391,11 @@ bool Lexer::isHexDigit(int index) {
return (character >= '0' && character <= '9') || (character >= 'a' && character <= 'f');
}
bool Lexer::isBinDigit(int index) {
char character = source.at(index);
return character == '0' || character == '1';
}
bool Lexer::isIdentifier(int index) {
char character = source.at(index);
bool isDigit = character >= '0' && character <= '9';

View File

@@ -20,6 +20,7 @@ private:
shared_ptr<Token> match(TokenKind kind, string lexme, bool needsSeparator);
shared_ptr<Token> matchIntegerDec();
shared_ptr<Token> matchIntegerHex();
shared_ptr<Token> matchIntegerBin();
shared_ptr<Token> matchReal();
shared_ptr<Token> matchIdentifier();
shared_ptr<Token> matchEnd();
@@ -28,6 +29,7 @@ private:
bool isWhiteSpace(int index);
bool isDecDigit(int index);
bool isHexDigit(int index);
bool isBinDigit(int index);
bool isIdentifier(int index);
bool isSeparator(int index);
void advanceWithToken(shared_ptr<Token> token);

View File

@@ -39,6 +39,7 @@ vector<TokenKind> Token::tokensLiteral = {
TokenKind::BOOL,
TokenKind::INTEGER_DEC,
TokenKind::INTEGER_HEX,
TokenKind::INTEGER_BIN,
TokenKind::REAL
};
@@ -126,6 +127,8 @@ string Token::toString() {
return "INTEGER_DEC(" + lexme + ")";
case TokenKind::INTEGER_HEX:
return "INTEGER_HEX(" + lexme + ")";
case TokenKind::INTEGER_BIN:
return "INTEGER_BIN(" + lexme + ")";
case TokenKind::REAL:
return "REAL(" + lexme + ")";
case TokenKind::IDENTIFIER:

View File

@@ -37,6 +37,7 @@ enum class TokenKind {
BOOL,
INTEGER_DEC,
INTEGER_HEX,
INTEGER_BIN,
REAL,
IDENTIFIER,
TYPE,

View File

@@ -138,6 +138,14 @@ Expression(ExpressionKind::LITERAL, ValueType::NONE) {
sint32Value = stoi(token->getLexme(), nullptr, 16);
valueType = ValueType::SINT32;
break;
case TokenKind::INTEGER_BIN:
sint32Value = stoi(
token->getLexme().substr(2, token->getLexme().size()-1),
nullptr,
2
);
valueType = ValueType::SINT32;
break;
case TokenKind::REAL:
real32Value = stof(token->getLexme());
valueType = ValueType::REAL32;