diff options
| Commit | 1df22a637e5c5ac090f7d90c5c666da1b22964d5 (patch) | |
|---|---|---|
| Author | 2018-09-11 09:38:31 +0300 | |
| Committer | 2018-09-11 09:38:31 +0300 | |
| Files | 69b7a527c7f6872c140f4b035929ad60f38cd017 /JSImpl/src/Expression.h | |
| IPL-1df22a637e5c5ac090f7d90c5c666da1b22964d5.tar IPL-1df22a637e5c5ac090f7d90c5c666da1b22964d5.tar.gz IPL-1df22a637e5c5ac090f7d90c5c666da1b22964d5.zip | ||
| Parent | eeab42ab1d16b5e3cfafeeffbe6aa8045212134e (diff) | |
Implement parsing for flow control elements like if, for etc.
1 files changed, 97 insertions, 14 deletions
| -rw-r--r-- | JSImpl/src/Expression.h | 111 |
diff --git a/JSImpl/src/Expression.h b/JSImpl/src/Expression.h index 3b68522..51cdd21 100644 --- a/JSImpl/src/Expression.h +++ b/JSImpl/src/Expression.h @@ -8,7 +8,7 @@ class Expression : public IPLEnableShared<Expression> public: virtual ~Expression() {} - virtual void Print(std::ostream& os) {}; + virtual void Print(std::ostream& os) const {}; }; using ExpressionPtr = IPLSharedPtr<Expression>; @@ -18,13 +18,13 @@ class BinaryExpression : public Expression { public: virtual ~BinaryExpression() {} - BinaryExpression(IPLSharedPtr<Expression> exprLeft, IPLSharedPtr<Expression> exprRight, TokenType op); - virtual void Print(std::ostream& os); + BinaryExpression(ExpressionPtr exprLeft, ExpressionPtr exprRight, TokenType op); + virtual void Print(std::ostream& os) const override; private: - IPLString GetOperatorTypeAsString(); + IPLString GetOperatorTypeAsString() const; private: - IPLSharedPtr<Expression> m_Left; - IPLSharedPtr<Expression> m_Right; + ExpressionPtr m_Left; + ExpressionPtr m_Right; TokenType m_Operator; }; @@ -35,9 +35,9 @@ class UnaryExpression : public Expression public: virtual ~UnaryExpression() {} UnaryExpression(IPLSharedPtr<Expression> expr, TokenType op, bool suffix); - virtual void Print(std::ostream& os); + virtual void Print(std::ostream& os) const override; private: - IPLString GetOperatorTypeAsString(); + IPLString GetOperatorTypeAsString() const; private: IPLSharedPtr<Expression> m_Expr; TokenType m_Operator; @@ -61,7 +61,7 @@ public: LiteralExpression(IPLString&); LiteralExpression(bool); LiteralExpression(TokenType type); - virtual void Print(std::ostream& os); + virtual void Print(std::ostream& os) const override; private: double m_NumValue; IPLString m_StringValue; @@ -73,10 +73,10 @@ private: class IdentifierExpression : public Expression { public: - IdentifierExpression(IPLString name, ExpressionPtr value); + IdentifierExpression(IPLString& name, ExpressionPtr value); virtual ~IdentifierExpression() {} - virtual void Print(std::ostream& os); -private: + virtual void Print(std::ostream& os) const override; +protected: IPLString m_Name; ExpressionPtr m_Value; }; @@ -87,7 +87,90 @@ public: ListExpression() {}; void Push(ExpressionPtr value) { m_Values.push_back(value); }; virtual ~ListExpression() {} - virtual void Print(std::ostream& os); -private: + virtual void Print(std::ostream& os) const override; +protected: IPLVector<ExpressionPtr> m_Values; }; + +class VariableDefinitionExpression : public IdentifierExpression +{ +public: + VariableDefinitionExpression(IPLString& name, ExpressionPtr value) : IdentifierExpression(name, value){} + virtual ~VariableDefinitionExpression() {} + virtual void Print(std::ostream& os) const override; +}; + +class BlockStatement : public ListExpression +{ +public: + BlockStatement() {}; + virtual ~BlockStatement() {} + virtual void Print(std::ostream& os) const override; +private: +}; + +class LabeledStatement : public Expression +{ +public: + LabeledStatement(IPLString& identifier, ExpressionPtr statements); + virtual ~LabeledStatement() {} + virtual void Print(std::ostream& os) const override; +private: + IPLString m_Identifier; + ExpressionPtr m_Statement; +}; + +class IfStatement : public Expression +{ +public: + IfStatement(ExpressionPtr cond, ExpressionPtr ifStatement, ExpressionPtr elseStatement); + virtual ~IfStatement() {} + virtual void Print(std::ostream& os) const override; +private: + ExpressionPtr m_Condition; + ExpressionPtr m_IfStatement; + ExpressionPtr m_ElseStatement; +}; + +class SwitchStatement : public Expression +{ +public: + struct Case + { + ExpressionPtr Condition; + ExpressionPtr Body; + }; + SwitchStatement(ExpressionPtr cond, IPLVector<Case>& cases, ExpressionPtr defaultCase); + virtual ~SwitchStatement() {} + virtual void Print(std::ostream& os) const override; +private: + ExpressionPtr m_Condition; + IPLVector<Case> m_Cases; + ExpressionPtr m_DefaultCase; +}; + +class WhileStatement : public Expression +{ +public: + WhileStatement(ExpressionPtr cond, ExpressionPtr body, bool doWhile); + virtual ~WhileStatement() {} + virtual void Print(std::ostream& os) const override; +private: + ExpressionPtr m_Condition; + ExpressionPtr m_Body; + bool m_DoWhile; +}; + +class ForStatement : public Expression +{ +public: + ForStatement(ExpressionPtr initialization, ExpressionPtr cond, ExpressionPtr iteration, ExpressionPtr body); + virtual ~ForStatement() {} + virtual void Print(std::ostream& os) const override; +private: + ExpressionPtr m_Initialization; + ExpressionPtr m_Condition; + ExpressionPtr m_Iteration; + ExpressionPtr m_Body; +}; + |
