diff --git a/src/tokenize.cpp b/src/tokenize.cpp index 4bb204e..d212462 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -119,15 +119,6 @@ vector tokenize(vector input, int initial_line) { tokens.emplace_back(token); j += 4; } - else if (regex_search(str, m, IDENTIFIER_REGEX, regex_constants::match_continuous)) { - Token token = { - .type = TokenType::Identifier, - .data = m.str(), - .pos = pos - }; - tokens.emplace_back(token); - j += m.str().length(); - } else if (str.starts_with("++")) { Token token = { .type = TokenType::DoublePlus, .pos = pos }; tokens.emplace_back(token); @@ -198,6 +189,15 @@ vector tokenize(vector input, int initial_line) { tokens.emplace_back(token); j += 1; } + else if (regex_search(str, m, IDENTIFIER_REGEX, regex_constants::match_continuous)) { + Token token = { + .type = TokenType::Identifier, + .data = m.str(), + .pos = pos + }; + tokens.emplace_back(token); + j += m.str().length(); + } else if (isspace(str[0])) { j += 1; } diff --git a/test/expr_arithmetiques.cpp b/test/expr_arithmetiques.cpp index 766ab28..09b833e 100644 --- a/test/expr_arithmetiques.cpp +++ b/test/expr_arithmetiques.cpp @@ -47,5 +47,23 @@ int main() { true ); + _TEST_ASSERT( + _TEST_NO_EXCEPTION(execute("int a = 27; ++a;") == 28), + "Incrémentation par la gauche", + true + ); + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(execute("int a = 27; a--;") == 27), + "Décrémentation par la droite", + true + ); + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(execute("int a = 27; -(+-++a);") == 28), + "Incrémentation et opérations unaires", + true + ); + return 0; } \ No newline at end of file diff --git a/test/statements.cpp b/test/statements.cpp new file mode 100644 index 0000000..7b69ab7 --- /dev/null +++ b/test/statements.cpp @@ -0,0 +1,39 @@ +#include "include/test.h" + +#include "../src/include/memory.h" +#include "../src/include/tokenize.h" +#include "../src/include/parser.h" +#include "../src/include/interpreter.h" + +EvalResult execute(string s) { + Memory memory = Memory(); + vector tokens = tokenize({ s }); + Node ast = parse(tokens); + EvalResult res = eval(ast, memory); + + return res; +} + +int main() { + _TEST_PRESENTATION("Statements"); + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(get(execute("int x = 0; if (1) x++; x;")) == 1), + "If vérifié", + true + ); + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(get(execute("int x = 0; if (0) x++; x;")) == 0), + "If pas vérifié", + true + ); + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(get(execute("int x = 1; if (0) x++; else x--; x;")) == 0), + "If else pas vérifié", + true + ); + + return 0; +} \ No newline at end of file diff --git a/test/variables.cpp b/test/variables.cpp index ce08e61..2d4c74c 100644 --- a/test/variables.cpp +++ b/test/variables.cpp @@ -5,53 +5,53 @@ #include "../src/include/parser.h" #include "../src/include/interpreter.h" -int execute(string s) { +EvalResult execute(string s) { Memory memory = Memory(); vector tokens = tokenize({ s }); Node ast = parse(tokens); EvalResult res = eval(ast, memory); - return get(res); + return res; } int main() { _TEST_PRESENTATION("Variables"); _TEST_ASSERT( - _TEST_NO_EXCEPTION(execute("int uneVariableFarfelue__ = 12;") == 12), + _TEST_NO_EXCEPTION(get(execute("int uneVariableFarfelue__ = 12;")) == 12), "Déclaration avec assignement", true ); _TEST_ASSERT( - _TEST_NO_EXCEPTION(execute("int x = 5; x = x + 3;") == 8), + _TEST_NO_EXCEPTION(get(execute("int x = 5; x = x + 3;")) == 8), "Déclaration puis assignement", true ); - _TEST_ASSERT( - _TEST_NO_EXCEPTION(execute("int a = 27; ++a;") == 28), - "Incrémentation par la gauche", - true - ); - - _TEST_ASSERT( - _TEST_NO_EXCEPTION(execute("int a = 27; a--;") == 27), - "Décrémentation par la droite", - true - ); - - _TEST_ASSERT( - _TEST_NO_EXCEPTION(execute("int a = 27; -(+-++a);") == 28), - "Incrémentation et opérations unaires", - true - ); - _TEST_ASSERT( _TEST_IS_EXCEPTION(execute("1 + x;"), RuntimeError), "Identifieur indéfini", true ); + _TEST_ASSERT( + _TEST_IS_EXCEPTION(execute("int x; int x;"), RuntimeError), + "Identifieur déjà défini", + true + ); + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(holds_alternative(execute("int x; { int x; }"))), + "Identifieur déjà défini dans une autre scope", + true + ); + + _TEST_ASSERT( + _TEST_NO_EXCEPTION(get(execute("int x = 1; int y; { int x = 2; y = x + 2; }; y;")) == 4), + "Shadowing", + true + ); + return 0; } \ No newline at end of file