diff options
| Commit | 2a606a420674912be50c573f7cb9674d728910a5 (patch) | |
|---|---|---|
| Author | 2018-09-26 09:11:22 +0300 | |
| Committer | 2018-09-26 09:22:22 +0300 | |
| Files | 69fc6379b3235e6a03b12a58ca372b116d120daa /JSImpl/src | |
| IPL-2a606a420674912be50c573f7cb9674d728910a5.tar IPL-2a606a420674912be50c573f7cb9674d728910a5.tar.gz IPL-2a606a420674912be50c573f7cb9674d728910a5.zip | ||
| Parent | 953f1748ec99d796cc39143796ca06de03123088 (diff) | |
Introduce expression visitor
1 files changed, 55 insertions, 1 deletions
| -rw-r--r-- | JSImpl/src/Expression.h | 56 |
diff --git a/JSImpl/src/Expression.h b/JSImpl/src/Expression.h index 0c23c6a..1934afc 100644 --- a/JSImpl/src/Expression.h +++ b/JSImpl/src/Expression.h @@ -3,15 +3,54 @@ #include "CommonTypes.h" #include "Lexer.h" +class Expression; +class BinaryExpression; +class UnaryExpression; +class LiteralExpression; +class IdentifierExpression; +class ListExpression; +class VariableDefinitionExpression; +class BlockStatement; +class LabeledStatement; +class IfStatement; +class SwitchStatement; +class WhileStatement; +class ForStatement; +class FunctionDeclaration; +class TopStatements; +class EmptyExpression; +using ExpressionPtr = IPLSharedPtr<Expression>; + +class ExpressionVisitor +{ +public: + ~ExpressionVisitor(){} + virtual void Visit(BinaryExpression* e) = 0; + virtual void Visit(UnaryExpression* e) = 0; + virtual void Visit(LiteralExpression* e) = 0; + virtual void Visit(IdentifierExpression* e) = 0; + virtual void Visit(ListExpression* e) = 0; + virtual void Visit(VariableDefinitionExpression* e) = 0; + virtual void Visit(BlockStatement* e) = 0; + virtual void Visit(LabeledStatement* e) = 0; + virtual void Visit(IfStatement* e) = 0; + virtual void Visit(SwitchStatement* e) = 0; + virtual void Visit(WhileStatement* e) = 0; + virtual void Visit(ForStatement* e) = 0; + virtual void Visit(FunctionDeclaration* e) = 0; + virtual void Visit(TopStatements* e) = 0; + virtual void Visit(EmptyExpression* e) = 0; +}; + class Expression : public IPLEnableShared<Expression> { public: virtual ~Expression() {} virtual void Print(std::ostream& os) const {}; + virtual void Accept(ExpressionVisitor& v) = 0; }; -using ExpressionPtr = IPLSharedPtr<Expression>; // binary:= expression operator expression class BinaryExpression : public Expression @@ -20,6 +59,7 @@ public: virtual ~BinaryExpression() {} BinaryExpression(ExpressionPtr exprLeft, ExpressionPtr exprRight, TokenType op); virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: IPLString GetOperatorTypeAsString() const; private: @@ -36,6 +76,7 @@ public: virtual ~UnaryExpression() {} UnaryExpression(IPLSharedPtr<Expression> expr, TokenType op, bool suffix); virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: IPLString GetOperatorTypeAsString() const; private: @@ -62,6 +103,7 @@ public: LiteralExpression(bool); LiteralExpression(TokenType type); virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: double m_NumValue; IPLString m_StringValue; @@ -76,6 +118,7 @@ public: IdentifierExpression(IPLString& name); virtual ~IdentifierExpression() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } protected: IPLString m_Name; @@ -88,6 +131,7 @@ public: void Push(ExpressionPtr value) { m_Values.push_back(value); }; virtual ~ListExpression() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } protected: IPLVector<ExpressionPtr> m_Values; }; @@ -98,6 +142,7 @@ public: VariableDefinitionExpression(IPLString& name, ExpressionPtr value) : IdentifierExpression(name), m_Value(value){} virtual ~VariableDefinitionExpression() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } protected: ExpressionPtr m_Value; }; @@ -108,6 +153,7 @@ public: BlockStatement() {}; virtual ~BlockStatement() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: }; @@ -117,6 +163,7 @@ public: LabeledStatement(IPLString& identifier, ExpressionPtr statements); virtual ~LabeledStatement() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: IPLString m_Identifier; ExpressionPtr m_Statement; @@ -128,6 +175,7 @@ public: IfStatement(ExpressionPtr cond, ExpressionPtr ifStatement, ExpressionPtr elseStatement); virtual ~IfStatement() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: ExpressionPtr m_Condition; ExpressionPtr m_IfStatement; @@ -145,6 +193,7 @@ public: SwitchStatement(ExpressionPtr cond, IPLVector<Case>& cases, ExpressionPtr defaultCase); virtual ~SwitchStatement() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: ExpressionPtr m_Condition; IPLVector<Case> m_Cases; @@ -157,6 +206,7 @@ public: WhileStatement(ExpressionPtr cond, ExpressionPtr body, bool doWhile); virtual ~WhileStatement() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: ExpressionPtr m_Condition; ExpressionPtr m_Body; @@ -169,6 +219,7 @@ public: ForStatement(ExpressionPtr initialization, ExpressionPtr cond, ExpressionPtr iteration, ExpressionPtr body); virtual ~ForStatement() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: ExpressionPtr m_Initialization; ExpressionPtr m_Condition; @@ -182,6 +233,7 @@ public: FunctionDeclaration(IPLString& functionName, IPLVector<IPLString>& argumentsIdentifiers, ExpressionPtr body); virtual ~FunctionDeclaration() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } private: IPLString m_Name; IPLVector<IPLString> m_ArgumentsIdentifiers; @@ -194,6 +246,7 @@ public: TopStatements() {} virtual ~TopStatements() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } }; class EmptyExpression : public Expression @@ -202,6 +255,7 @@ public: EmptyExpression() {} virtual ~EmptyExpression() {} virtual void Print(std::ostream& os) const override; + virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } }; inline ExpressionPtr CreateEmptyExpression() { return IPLMakeSharePtr<EmptyExpression>(); } |
