Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / src
diff options
context:
space:
mode:
2 files changed, 33 insertions, 20 deletions
-rw-r--r--JSImpl/src/ASTInterpreter.cpp50
-rw-r--r--JSImpl/src/Lexer.cpp3
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
{