From 1df22a637e5c5ac090f7d90c5c666da1b22964d5 Mon Sep 17 00:00:00 2001 From: martin dobrev Date: Tue, 11 Sep 2018 09:38:31 +0300 Subject: Implement parsing for flow control elements like if, for etc. --- JSImpl/src/Expression.h | 111 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 14 deletions(-) (limited to 'JSImpl/src/Expression.h') 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 public: virtual ~Expression() {} - virtual void Print(std::ostream& os) {}; + virtual void Print(std::ostream& os) const {}; }; using ExpressionPtr = IPLSharedPtr; @@ -18,13 +18,13 @@ class BinaryExpression : public Expression { public: virtual ~BinaryExpression() {} - BinaryExpression(IPLSharedPtr exprLeft, IPLSharedPtr 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 m_Left; - IPLSharedPtr m_Right; + ExpressionPtr m_Left; + ExpressionPtr m_Right; TokenType m_Operator; }; @@ -35,9 +35,9 @@ class UnaryExpression : public Expression public: virtual ~UnaryExpression() {} UnaryExpression(IPLSharedPtr 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 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 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& cases, ExpressionPtr defaultCase); + virtual ~SwitchStatement() {} + virtual void Print(std::ostream& os) const override; +private: + ExpressionPtr m_Condition; + IPLVector 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; +}; + -- cgit v1.3.1-23-gd82d