Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl
diff options
context:
space:
mode:
Commitf8ccf5eedb60435b7fac66521554beab582c0b00 (patch)
Author
 alexvitkov <44268717+alexvitkov@users.noreply.github.com>
2020-10-24 17:58:54 +0300
Committer
 GitHub <noreply@github.com>
2020-10-24 17:58:54 +0300
Filescbee6e087ffc49463c69553c9505f4b9a7baa5ce /JSImpl
IPL-f8ccf5eedb60435b7fac66521554beab582c0b00.tar
IPL-f8ccf5eedb60435b7fac66521554beab582c0b00.tar.gz
IPL-f8ccf5eedb60435b7fac66521554beab582c0b00.zip
Parentd5fd7629fc6b85df0f27f3069bffef407a94cef8 (diff)
JSImpl: Implemented ASTInterpreter::Visit for unary + and - (#87)
* JSImpl: Implemented ASTInterpreter::Visit for unary + and - * JSImpl: Added tests for unary + and - * JSImpl: fixed appveyor ubuntu build Co-authored-by: Martin Dobrev <martindobrev0@gmail.com>
3 files changed, 36 insertions, 21 deletions
-rw-r--r--JSImpl/src/ASTInterpreter.cpp50
-rw-r--r--JSImpl/src/Lexer.cpp3
-rw-r--r--JSImpl/test/ParserTests.cpp4
diff --git a/JSImpl/src/ASTInterpreter.cpp b/JSImpl/src/ASTInterpreter.cpp
index 25f5c02..9874a4d 100644
--- a/JSImpl/src/ASTInterpreter.cpp
+++ b/JSImpl/src/ASTInterpreter.cpp
@@ -216,27 +216,41 @@ void ASTInterpreter::Visit(BinaryExpression* e) {
}
void ASTInterpreter::Visit(UnaryExpression* e) {
- LValueExtractor extractor(this);
- auto lvalue = extractor.Run(e->GetExpr().get());
- if (e->GetSuffix())
- {
- m_Evaluation.push_back(*lvalue);
- }
switch (e->GetOperator())
{
- case TokenType::PlusPlus:
- ++(*lvalue);
- break;
- case TokenType::MinusMinus:
- --(*lvalue);
- break;
- default:
- NOT_IMPLEMENTED;
- }
- if (!e->GetSuffix())
- {
- m_Evaluation.push_back(*lvalue);
+ case TokenType::Minus:
+ {
+ e->GetExpr()->Accept(*this);
+ m_Evaluation.back() *= -1;
+ break;
+ }
+ case TokenType::Plus:
+ {
+ e->GetExpr()->Accept(*this);
+ break;
+ }
+ case TokenType::PlusPlus: // FALLTHROUGH
+ case TokenType::MinusMinus:
+ {
+ LValueExtractor extractor(this);
+ auto lvalue = extractor.Run(e->GetExpr().get());
+ if (e->GetSuffix())
+ {
+ m_Evaluation.push_back(*lvalue);
+ }
+ *lvalue += e->GetOperator() == TokenType::PlusPlus ? 1 : -1;
+ if (!e->GetSuffix())
+ {
+ m_Evaluation.push_back(*lvalue);
+ }
+ break;
+ }
+ default:
+ {
+ NOT_IMPLEMENTED;
+ }
}
+
}
void ASTInterpreter::Visit(IdentifierExpression* e) {
diff --git a/JSImpl/src/Lexer.cpp b/JSImpl/src/Lexer.cpp
index 0f6f4a6..4a2deb8 100644
--- a/JSImpl/src/Lexer.cpp
+++ b/JSImpl/src/Lexer.cpp
@@ -179,8 +179,7 @@ Tokenizer::Tokenizer(const char* code, const LexerSettings& settings)
LexerResult Tokenizer::Tokenize()
{
- LexerResult result;
- result.IsSuccessful = true;
+ LexerResult result{ true, IPLError(), IPLVector<Token>() };
Token token;
do
{
diff --git a/JSImpl/test/ParserTests.cpp b/JSImpl/test/ParserTests.cpp
index 91534c5..8bdfb8c 100644
--- a/JSImpl/test/ParserTests.cpp
+++ b/JSImpl/test/ParserTests.cpp
@@ -103,7 +103,7 @@ TEST(Parser, VariableDeclarationMultiplicationOfVariables)
TEST(Parser, Unary)
{
- IPLVector<Token> tokens = Tokenize("var a = 5; a++; var b = 6; --b;").tokens;
+ IPLVector<Token> tokens = Tokenize("var a = 5; a++; var b = 6; --b; var minusB = -b; var plusB = +b;").tokens;
auto expr = Parse(tokens);
std::ostringstream output;
@@ -113,6 +113,8 @@ TEST(Parser, Unary)
ASSERT_TRUE(i.HasVariable("b"));
ASSERT_DOUBLE_EQ(i.ModifyVariable("a"), 6.0);
ASSERT_DOUBLE_EQ(i.ModifyVariable("b"), 5.0);
+ ASSERT_DOUBLE_EQ(i.ModifyVariable("minusB"), -5.0);
+ ASSERT_DOUBLE_EQ(i.ModifyVariable("plusB"), +5.0);
}