Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / src
diff options
context:
space:
mode:
Commit2a606a420674912be50c573f7cb9674d728910a5 (patch)
Author
 martin dobrev <martindobrev0@gmail.com>
2018-09-26 09:11:22 +0300
Committer
 martin dobrev <martindobrev0@gmail.com>
2018-09-26 09:22:22 +0300
Files69fc6379b3235e6a03b12a58ca372b116d120daa /JSImpl/src
IPL-2a606a420674912be50c573f7cb9674d728910a5.tar
IPL-2a606a420674912be50c573f7cb9674d728910a5.tar.gz
IPL-2a606a420674912be50c573f7cb9674d728910a5.zip
Parent953f1748ec99d796cc39143796ca06de03123088 (diff)
Introduce expression visitor
1 files changed, 55 insertions, 1 deletions
-rw-r--r--JSImpl/src/Expression.h56
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>(); }