diff options
| Commit | f5b37017965efbc73deddc8a8afaabc9274dd530 (patch) | |
|---|---|---|
| Author | 2018-09-07 19:59:15 +0300 | |
| Committer | 2018-09-07 19:59:15 +0300 | |
| Files | 3ee1ef68b85f28a47a697678a4872e9ad751f90b /JSImpl/src/Parser.cpp | |
| IPL-f5b37017965efbc73deddc8a8afaabc9274dd530.tar IPL-f5b37017965efbc73deddc8a8afaabc9274dd530.tar.gz IPL-f5b37017965efbc73deddc8a8afaabc9274dd530.zip | ||
| Parent | df537df158e0375b01c0a7acdd98aa2f57db5ac3 (diff) | |
Implement some binary expression in Parser
1 files changed, 150 insertions, 1 deletions
| -rw-r--r-- | JSImpl/src/Parser.cpp | 151 |
diff --git a/JSImpl/src/Parser.cpp b/JSImpl/src/Parser.cpp index 1eceb7f..c0201b8 100644 --- a/JSImpl/src/Parser.cpp +++ b/JSImpl/src/Parser.cpp @@ -11,7 +11,12 @@ private: ExpressionPtr Unary(); ExpressionPtr LeftSideExpression(); ExpressionPtr SimpleExpression(); - + ExpressionPtr MultiplicativeExpression(); + ExpressionPtr AdditiveExpression(); + ExpressionPtr ShiftExpression(); + ExpressionPtr RelationalExpression(); + ExpressionPtr EqualityExpression(); + ExpressionPtr BitwiseAndExpression(); Token& Prev() { return m_Tokens[m_Current - 1]; } std::function<void()> OnError; unsigned m_Current; @@ -168,6 +173,150 @@ ExpressionPtr Parser::Unary() } } +ExpressionPtr Parser::MultiplicativeExpression() +{ + //MultiplicativeExpression + // UnaryExpression + // | MultiplicativeExpression * UnaryExpression normal + // | MultiplicativeExpression / UnaryExpression normal + // | MultiplicativeExpression % UnaryExpression normal + auto left = Unary(); + if (MatchOneOf({ TokenType::Star, TokenType::Division, TokenType::Modulo })) + { + auto right = Unary(); + return IPLMakeSharePtr<BinaryExpression>(left, right, Prev().Type); + } + return left; +} + +ExpressionPtr Parser::AdditiveExpression() +{ + //AdditiveExpression + // MultiplicativeExpression + // | AdditiveExpression + MultiplicativeExpression normal + // | AdditiveExpression - MultiplicativeExpression normal + auto left = MultiplicativeExpression(); + if (MatchOneOf({ TokenType::Plus, TokenType::Minus})) + { + auto right = MultiplicativeExpression(); + return IPLMakeSharePtr<BinaryExpression>(left, right, Prev().Type); + } + return left; +} + +ExpressionPtr Parser::ShiftExpression() +{ + //ShiftExpression + // AdditiveExpression + // | ShiftExpression << AdditiveExpression normal + // | ShiftExpression >> AdditiveExpression normal + // | ShiftExpression >> > AdditiveExpression normal + auto left = AdditiveExpression(); + if (MatchOneOf({ TokenType::LeftShift, TokenType::RightShift })) + { + auto right = AdditiveExpression(); + return IPLMakeSharePtr<BinaryExpression>(left, right, Prev().Type); + } + return left; +} + +ExpressionPtr Parser::RelationalExpression() +{ + //RelationalExpression, allowIn -> + // ShiftExpression + // | RelationalExpression, allowIn < ShiftExpression normal + // | RelationalExpression, allowIn > ShiftExpression normal + // | RelationalExpression, allowIn <= ShiftExpression normal + // | RelationalExpression, allowIn >= ShiftExpression normal + // | RelationalExpression, allowIn instanceof ShiftExpression normal + // | RelationalExpression, allowIn in ShiftExpression normal + // RelationalExpression, noIn -> + // ShiftExpression + // | RelationalExpression, noIn < ShiftExpression normal + // | RelationalExpression, noIn > ShiftExpression normal + // | RelationalExpression, noIn <= ShiftExpression normal + // | RelationalExpression, noIn >= ShiftExpression normal + // | RelationalExpression, noIn instanceof ShiftExpression normal + auto left = ShiftExpression(); + if (MatchOneOf({ TokenType::Less, + TokenType::Greater, + TokenType::LessEqual, + TokenType::GreaterEqual, + TokenType::Instanceof, + TokenType::In + })) + { + auto right = ShiftExpression(); + return IPLMakeSharePtr<BinaryExpression>(left, right, Prev().Type); + } + return left; +} + +ExpressionPtr Parser::EqualityExpression() +{ + //EqualityExpression + // RelationalExpression + // | EqualityExpression == RelationalExpression normal + // | EqualityExpression != RelationalExpression normal + // | EqualityExpression == = RelationalExpression normal + // | EqualityExpression != = RelationalExpression normal + auto left = RelationalExpression(); + if (MatchOneOf({ TokenType::Equal, + TokenType::BangEqual, + TokenType::StrictEqual, + TokenType::StrictNotEqual, + })) + { + auto right = RelationalExpression(); + return IPLMakeSharePtr<BinaryExpression>(left, right, Prev().Type); + } + return left; +} + +ExpressionPtr Parser::BitwiseAndExpression() +{ + auto BitwiseAndExpression = [=]() -> ExpressionPtr { + //BitwiseAndExpression -> + // EqualityExpression + // | BitwiseAndExpression & EqualityExpression normal + auto left = EqualityExpression(); + if (Match(TokenType::BitwiseAnd)) + { + auto right = RelationalExpression(); + return IPLMakeSharePtr<BinaryExpression>(left, right, Prev().Type); + } + return left; + }; + + auto BitwiseXorExpression = [=]() -> ExpressionPtr { + //BitwiseXorExpression -> + // BitwiseAndExpression + // | BitwiseXorExpression ^ BitwiseAndExpression normal + auto left = BitwiseAndExpression(); + if (Match(TokenType::BitwiseAnd)) + { + auto right = BitwiseAndExpression(); + return IPLMakeSharePtr<BinaryExpression>(left, right, Prev().Type); + } + return left; + }; + + auto BitwiseOrExpression = [=]() -> ExpressionPtr { + //BitwiseOrExpression -> + // BitwiseXorExpression + // | BitwiseOrExpression | BitwiseXorExpression normal + auto left = BitwiseXorExpression(); + if (Match(TokenType::BitwiseAnd)) + { + auto right = BitwiseXorExpression(); + return IPLMakeSharePtr<BinaryExpression>(left, right, Prev().Type); + } + return left; + }; + + return BitwiseOrExpression(); +} + ExpressionPtr Parser::Parse() { // TODO implement full grammar |
