Initial commit, support for lexing symbols and numericals.

This commit is contained in:
2020-10-04 16:33:12 +02:00
commit e0c52f4ae7
13 changed files with 6895 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
#include "../../extern/doctest.hpp"
#include "../../src/Parser/Lexer/Lexer.hpp"
using namespace ElohimScript::Parser;
#define INTEGER_TEST(script, expected) \
TEST_CASE("Lex " script) { \
auto lexer = Lexer(script); \
const auto* token = lexer.Lex(); \
REQUIRE(token->GetKind() == LexTokenKind::IntegerToken); \
auto value = ((const IntegerToken*)token)->GetValue(); \
CHECK(value == (expected)); \
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \
delete token; \
}
#define FLOAT_TEST(script, expected) \
TEST_CASE("Lex " script) { \
auto lexer = Lexer(script); \
const auto* token = lexer.Lex(); \
REQUIRE(token->GetKind() == LexTokenKind::FloatToken); \
auto value = ((const FloatToken*)token)->GetValue(); \
CHECK(value == (expected)); \
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \
delete token; \
}
// Decimal lexing
INTEGER_TEST("123456", 123456);
INTEGER_TEST("0d123456", 123456);
INTEGER_TEST("50000000000", 50000000000);
// Decimal float lexing
FLOAT_TEST("123.456", 123.456);
FLOAT_TEST("0.456", 0.456);
FLOAT_TEST("0.456e12", 0.456e12);
FLOAT_TEST("0.456E12", 0.456E12);
// Hexadecimal lexing
INTEGER_TEST("0x0", 0);
INTEGER_TEST("0xF", 15);
INTEGER_TEST("0xf", 15);
INTEGER_TEST("0xFF", 255);
INTEGER_TEST("0xfF", 255);
INTEGER_TEST("0xFFF", 4095);
INTEGER_TEST("0xFFFF", 65535);
INTEGER_TEST("0xFFFFF", 1048575);
INTEGER_TEST("0xFFFFFF", 16777215);
// Octal lexing
INTEGER_TEST("0o0", 0);
INTEGER_TEST("0o7", 7);
INTEGER_TEST("0o77", 63);
INTEGER_TEST("0o777", 511);
INTEGER_TEST("0o7777", 4095);
// Binary lexing
INTEGER_TEST("0b0", 0);
INTEGER_TEST("0b1", 1);
INTEGER_TEST("0b11", 3);
INTEGER_TEST("0b111", 7);
INTEGER_TEST("0b1111", 15);
INTEGER_TEST("0b110011", 51);

View File

@@ -0,0 +1,81 @@
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "../../extern/doctest.hpp"
#include "../../src/Parser/Lexer/Lexer.hpp"
using namespace ElohimScript::Parser;
#define SYMBOL_TEST(script, symbol) \
TEST_CASE("Lex " script) { \
auto lexer = Lexer(script); \
const auto* token = lexer.Lex(); \
CHECK(token->GetKind() == LexTokenKind::symbol); \
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile); \
delete token; \
}
SYMBOL_TEST("*", StarSymbol)
SYMBOL_TEST("**", StarStarSymbol)
SYMBOL_TEST("*=", StarEqualsSymbol)
SYMBOL_TEST("**=", StarStarEqualsSymbol)
SYMBOL_TEST("/", SlashSymbol)
SYMBOL_TEST("/=", SlashEqualsSymbol)
SYMBOL_TEST("%", PercentSymbol)
SYMBOL_TEST("%=", PercentEqualsSymbol)
SYMBOL_TEST("+", PlusSymbol)
SYMBOL_TEST("+=", PlusEqualsSymbol)
SYMBOL_TEST("++", PlusPlusSymbol)
SYMBOL_TEST("-", MinusSymbol)
SYMBOL_TEST("-=", MinusEqualsSymbol)
SYMBOL_TEST("--", MinusMinusSymbol)
SYMBOL_TEST("<", LessThanSymbol)
SYMBOL_TEST("<=", LessThanEqualsSymbol)
SYMBOL_TEST("<<", LessThanLessThanSymbol)
SYMBOL_TEST("<<=", LessThanLessThanEqualsSymbol)
SYMBOL_TEST(">", GreaterThanSymbol)
SYMBOL_TEST(">=", GreaterThanEqualsSymbol)
SYMBOL_TEST(">>", GreaterThanGreaterThanSymbol)
SYMBOL_TEST(">>=", GreaterThanGreaterThanEqualsSymbol)
SYMBOL_TEST(">>>", GreaterThanGreaterThanGreaterThanSymbol)
SYMBOL_TEST(">>>=", GreaterThanGreaterThanGreaterThanEqualsSymbol)
SYMBOL_TEST("(", OpenParenthesisSymbol)
SYMBOL_TEST(")", CloseParenthesisSymbol)
SYMBOL_TEST("=", EqualsSymbol)
SYMBOL_TEST("==", EqualsEqualsSymbol)
SYMBOL_TEST("!", ExclamationMarkSymbol)
SYMBOL_TEST("!=", ExclamationMarkEqualsSymbol)
SYMBOL_TEST("!is", ExclamationMarkIsSymbol)
SYMBOL_TEST("?", QuestionMarkSymbol)
SYMBOL_TEST(":", ColonSymbol)
SYMBOL_TEST("::", ColonColonSymbol)
SYMBOL_TEST("&", AmpersandSymbol)
SYMBOL_TEST("&=", AmpersandEqualsSymbol)
SYMBOL_TEST("&&", AmpersandAmpersandSymbol)
SYMBOL_TEST(",", CommaSymbol)
SYMBOL_TEST("{", OpenCurlyParenthesisSymbol)
SYMBOL_TEST("}", CloseCurlyParenthesisSymbol)
SYMBOL_TEST(";", SemicolonSymbol)
SYMBOL_TEST("|", VerticalLineSymbol)
SYMBOL_TEST("|=", VerticalLineEqualsSymbol)
SYMBOL_TEST("||", VerticalLineVerticalLineSymbol)
SYMBOL_TEST("^", CaretSymbol)
SYMBOL_TEST("^=", CaretEqualsSymbol)
SYMBOL_TEST("^^", CaretCaretSymbol)
SYMBOL_TEST("~", TildeSymbol)
SYMBOL_TEST(".", DotSymbol)
SYMBOL_TEST("[", OpenBlockParenthesisSymbol)
SYMBOL_TEST("]", CloseBlockParenthesisSymbol)
SYMBOL_TEST("@", AtSymbol)
SYMBOL_TEST(" ", Whitespace)
#undef SYMBOL_TEST
TEST_CASE("Lex whitespace") {
auto whitespace = {" ", "\t", "\n", "\r", "\xef\xbb\xbf"};
for (auto v : whitespace) {
auto lexer = Lexer(v);
const auto* token = lexer.Lex();
CHECK(token->GetKind() == LexTokenKind::Whitespace);
CHECK(token->GetNext()->GetKind() == LexTokenKind::EndOfFile);
delete token;
}
}