diff options
2 files changed, 33 insertions, 20 deletions
| -rw-r--r-- | JSImpl/src/ASTInterpreter.cpp | 50 | ||||
| -rw-r--r-- | JSImpl/src/Lexer.cpp | 3 |
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 { |
