Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / src / Expression.h
diff options
context:
space:
mode:
Commit1df22a637e5c5ac090f7d90c5c666da1b22964d5 (patch)
Author
 martin dobrev <martindobrev0@gmail.com>
2018-09-11 09:38:31 +0300
Committer
 martin dobrev <martindobrev0@gmail.com>
2018-09-11 09:38:31 +0300
Files69b7a527c7f6872c140f4b035929ad60f38cd017 /JSImpl/src/Expression.h
IPL-1df22a637e5c5ac090f7d90c5c666da1b22964d5.tar
IPL-1df22a637e5c5ac090f7d90c5c666da1b22964d5.tar.gz
IPL-1df22a637e5c5ac090f7d90c5c666da1b22964d5.zip
Parenteeab42ab1d16b5e3cfafeeffbe6aa8045212134e (diff)
Implement parsing for flow control elements like if, for etc.
1 files changed, 97 insertions, 14 deletions
-rw-r--r--JSImpl/src/Expression.h111
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;
+};
+