Binary literals
This commit is contained in:
@@ -216,6 +216,9 @@ shared_ptr<Token> Lexer::nextToken() {
|
|||||||
if (token != nullptr)
|
if (token != nullptr)
|
||||||
return token;
|
return token;
|
||||||
|
|
||||||
|
token = matchIntegerBin();
|
||||||
|
if (token != nullptr)
|
||||||
|
return token;
|
||||||
|
|
||||||
// type
|
// type
|
||||||
token = match(TokenKind::TYPE, "bool", true);
|
token = match(TokenKind::TYPE, "bool", true);
|
||||||
@@ -302,6 +305,28 @@ shared_ptr<Token> Lexer::matchIntegerHex() {
|
|||||||
return token;
|
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() {
|
shared_ptr<Token> Lexer::matchReal() {
|
||||||
int nextIndex = currentIndex;
|
int nextIndex = currentIndex;
|
||||||
|
|
||||||
@@ -366,6 +391,11 @@ bool Lexer::isHexDigit(int index) {
|
|||||||
return (character >= '0' && character <= '9') || (character >= 'a' && character <= 'f');
|
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) {
|
bool Lexer::isIdentifier(int index) {
|
||||||
char character = source.at(index);
|
char character = source.at(index);
|
||||||
bool isDigit = character >= '0' && character <= '9';
|
bool isDigit = character >= '0' && character <= '9';
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ private:
|
|||||||
shared_ptr<Token> match(TokenKind kind, string lexme, bool needsSeparator);
|
shared_ptr<Token> match(TokenKind kind, string lexme, bool needsSeparator);
|
||||||
shared_ptr<Token> matchIntegerDec();
|
shared_ptr<Token> matchIntegerDec();
|
||||||
shared_ptr<Token> matchIntegerHex();
|
shared_ptr<Token> matchIntegerHex();
|
||||||
|
shared_ptr<Token> matchIntegerBin();
|
||||||
shared_ptr<Token> matchReal();
|
shared_ptr<Token> matchReal();
|
||||||
shared_ptr<Token> matchIdentifier();
|
shared_ptr<Token> matchIdentifier();
|
||||||
shared_ptr<Token> matchEnd();
|
shared_ptr<Token> matchEnd();
|
||||||
@@ -28,6 +29,7 @@ private:
|
|||||||
bool isWhiteSpace(int index);
|
bool isWhiteSpace(int index);
|
||||||
bool isDecDigit(int index);
|
bool isDecDigit(int index);
|
||||||
bool isHexDigit(int index);
|
bool isHexDigit(int index);
|
||||||
|
bool isBinDigit(int index);
|
||||||
bool isIdentifier(int index);
|
bool isIdentifier(int index);
|
||||||
bool isSeparator(int index);
|
bool isSeparator(int index);
|
||||||
void advanceWithToken(shared_ptr<Token> token);
|
void advanceWithToken(shared_ptr<Token> token);
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ vector<TokenKind> Token::tokensLiteral = {
|
|||||||
TokenKind::BOOL,
|
TokenKind::BOOL,
|
||||||
TokenKind::INTEGER_DEC,
|
TokenKind::INTEGER_DEC,
|
||||||
TokenKind::INTEGER_HEX,
|
TokenKind::INTEGER_HEX,
|
||||||
|
TokenKind::INTEGER_BIN,
|
||||||
TokenKind::REAL
|
TokenKind::REAL
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -126,6 +127,8 @@ string Token::toString() {
|
|||||||
return "INTEGER_DEC(" + lexme + ")";
|
return "INTEGER_DEC(" + lexme + ")";
|
||||||
case TokenKind::INTEGER_HEX:
|
case TokenKind::INTEGER_HEX:
|
||||||
return "INTEGER_HEX(" + lexme + ")";
|
return "INTEGER_HEX(" + lexme + ")";
|
||||||
|
case TokenKind::INTEGER_BIN:
|
||||||
|
return "INTEGER_BIN(" + lexme + ")";
|
||||||
case TokenKind::REAL:
|
case TokenKind::REAL:
|
||||||
return "REAL(" + lexme + ")";
|
return "REAL(" + lexme + ")";
|
||||||
case TokenKind::IDENTIFIER:
|
case TokenKind::IDENTIFIER:
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ enum class TokenKind {
|
|||||||
BOOL,
|
BOOL,
|
||||||
INTEGER_DEC,
|
INTEGER_DEC,
|
||||||
INTEGER_HEX,
|
INTEGER_HEX,
|
||||||
|
INTEGER_BIN,
|
||||||
REAL,
|
REAL,
|
||||||
IDENTIFIER,
|
IDENTIFIER,
|
||||||
TYPE,
|
TYPE,
|
||||||
|
|||||||
@@ -138,6 +138,14 @@ Expression(ExpressionKind::LITERAL, ValueType::NONE) {
|
|||||||
sint32Value = stoi(token->getLexme(), nullptr, 16);
|
sint32Value = stoi(token->getLexme(), nullptr, 16);
|
||||||
valueType = ValueType::SINT32;
|
valueType = ValueType::SINT32;
|
||||||
break;
|
break;
|
||||||
|
case TokenKind::INTEGER_BIN:
|
||||||
|
sint32Value = stoi(
|
||||||
|
token->getLexme().substr(2, token->getLexme().size()-1),
|
||||||
|
nullptr,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
valueType = ValueType::SINT32;
|
||||||
|
break;
|
||||||
case TokenKind::REAL:
|
case TokenKind::REAL:
|
||||||
real32Value = stof(token->getLexme());
|
real32Value = stof(token->getLexme());
|
||||||
valueType = ValueType::REAL32;
|
valueType = ValueType::REAL32;
|
||||||
|
|||||||
Reference in New Issue
Block a user