Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / src / Expression.h
diff options
context:
space:
mode:
Commit4233fbfb9229c2c1d334075b7eb32410450f7a3d (patch)
Author
 martin dobrev <martindobrev0@gmail.com>
2018-10-05 09:35:33 +0300
Committer
 martin dobrev <martindobrev0@gmail.com>
2018-10-14 13:14:54 +0300
Files44361885a519bf4b71774b15e1b2219ba3ad6fea /JSImpl/src/Expression.h
IPL-4233fbfb9229c2c1d334075b7eb32410450f7a3d.tar
IPL-4233fbfb9229c2c1d334075b7eb32410450f7a3d.tar.gz
IPL-4233fbfb9229c2c1d334075b7eb32410450f7a3d.zip
Parentf398d80f395e7c4592fb6cc5d90d41a89dc127c7 (diff)
Now all expressions will be auto generated.
1 files changed, 116 insertions, 174 deletions
-rw-r--r--JSImpl/src/Expression.h290
diff --git a/JSImpl/src/Expression.h b/JSImpl/src/Expression.h
index dc37753..df8c00b 100644
--- a/JSImpl/src/Expression.h
+++ b/JSImpl/src/Expression.h
@@ -8,62 +8,32 @@ class Expression : public IPLEnableShared<Expression>
{
public:
virtual ~Expression() {}
- virtual void Print(std::ostream&) const {};
virtual void Accept(ExpressionVisitor& v) = 0;
};
-// binary:= expression operator expression
-class BinaryExpression : public Expression
+enum class LiteralType
{
-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:
- ExpressionPtr m_Left;
- ExpressionPtr m_Right;
- TokenType m_Operator;
-};
-
-// binary:= expression operator |
-// operator expression
-class UnaryExpression : public Expression
-{
-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:
- IPLSharedPtr<Expression> m_Expr;
- TokenType m_Operator;
- bool m_Suffix;
+ Number,
+ String,
+ Boolean,
+ Null,
+ Undefined
};
-// literal:= number | string | true | false | null | undefined
class LiteralExpression : public Expression
{
public:
- enum LiteralType
- {
- Number,
- String,
- Boolean,
- Null,
- Undefined,
- };
+
virtual ~LiteralExpression() {}
LiteralExpression(double);
LiteralExpression(IPLString&);
LiteralExpression(bool);
LiteralExpression(TokenType type);
- virtual void Print(std::ostream& os) const override;
virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); }
+ double GetNumValue() const { return m_NumValue; }
+ const IPLString& GetStringValue() const { return m_StringValue; }
+ bool GetBooleanValue() const { return m_BooleanValue; }
+ LiteralType GetLiteralType() const { return m_Type; }
private:
LiteralType m_Type;
bool m_BooleanValue;
@@ -72,150 +42,122 @@ private:
};
-class IdentifierExpression : public Expression
-{
-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;
+#define EXPAND_ARGUMENT(type, name, def)\
+ type name = def,
-};
+#define EXPAND_INITIALIZER_LIST(type, name, def)\
+ m_##name(name),
-class ListExpression : public Expression
-{
-public:
- ListExpression() {};
- 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;
-};
+#define GENERATE_GETTERS(type, name, def)\
+ const type& Get##name() const { return m_##name; }\
+ type& Get##name##ByRef() { return m_##name; }
-class VariableDefinitionExpression : public IdentifierExpression
-{
-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;
-};
+#define GENERATE_MEMBER_DEFINITIONS(type, name, def)\
+ type m_##name;
-class BlockStatement : public ListExpression
-{
-public:
- BlockStatement() {};
- virtual ~BlockStatement() {}
- virtual void Print(std::ostream& os) const override;
- virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); }
-private:
-};
+#define GENERATE_EXPRESSION(ClassName, Base, MEMBERS_ITERATOR) \
+ class ClassName : public Base \
+ { \
+ public: \
+ ClassName(MEMBERS_ITERATOR(EXPAND_ARGUMENT) bool __dummy = 0) \
+ : \
+ MEMBERS_ITERATOR(EXPAND_INITIALIZER_LIST) m_dummy(__dummy) {} \
+ virtual ~ClassName() {} \
+ virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); } \
+ \
+ MEMBERS_ITERATOR(GENERATE_GETTERS) \
+ private: \
+ MEMBERS_ITERATOR(GENERATE_MEMBER_DEFINITIONS) \
+ bool m_dummy; \
+ };
-class LabeledStatement : public Expression
-{
-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;
-};
-class IfStatement : public Expression
-{
-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;
- ExpressionPtr m_ElseStatement;
-};
+#define BINARY_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(ExpressionPtr, Left, nullptr)\
+ MACRO(ExpressionPtr, Right, nullptr)\
+ MACRO(TokenType, Operator, TokenType::Invalid)
-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;
- virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); }
-private:
- ExpressionPtr m_Condition;
- IPLVector<Case> m_Cases;
- ExpressionPtr m_DefaultCase;
-};
+#define UNARY_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(IPLSharedPtr<Expression>, Expr, nullptr)\
+ MACRO(TokenType, Operator, TokenType::Invalid)\
+ MACRO(bool, Suffix, false)
-class WhileStatement : public Expression
-{
-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;
- bool m_DoWhile;
-};
+#define LITERAL_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(double, NumValue, 0.)\
+ MACRO(IPLString, StringValue, "")\
+ MACRO(bool, BooleanValue, false)\
+ MACRO(LiteralType, Type, LiteralType::Undefined)
-class ForStatement : public Expression
-{
-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;
- ExpressionPtr m_Iteration;
- ExpressionPtr m_Body;
-};
+#define IDENTIFIER_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(IPLString, Name, "")
-class FunctionDeclaration : public Expression
-{
-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;
- ExpressionPtr m_Body;
-};
+#define VARIABLEDEFINITION_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(IPLString, Name, "")\
+ MACRO(ExpressionPtr, Value, nullptr)
-class TopStatements : public ListExpression
-{
-public:
- TopStatements() {}
- virtual ~TopStatements() {}
- virtual void Print(std::ostream& os) const override;
- virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); }
-};
+#define LIST_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(IPLVector<ExpressionPtr>, Values, IPLVector<ExpressionPtr>())
-class EmptyExpression : public Expression
-{
-public:
- EmptyExpression() {}
- virtual ~EmptyExpression() {}
- virtual void Print(std::ostream& os) const override;
- virtual void Accept(ExpressionVisitor& v) override { v.Visit(this); }
-};
+#define BLOCK_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(IPLVector<ExpressionPtr>, Values, IPLVector<ExpressionPtr>())
+
+#define LABELED_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(IPLString, Identifier, "")\
+ MACRO(ExpressionPtr, Statement, nullptr)
+
+#define IF_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(ExpressionPtr, Condition, nullptr)\
+ MACRO(ExpressionPtr, IfStatement, nullptr)\
+ MACRO(ExpressionPtr, ElseStatement, nullptr)
+
+#define CASE_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(ExpressionPtr, Condition, nullptr)\
+ MACRO(ExpressionPtr, Body, nullptr)
+
+#define SWITCH_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(ExpressionPtr, Condition, nullptr)\
+ MACRO(IPLVector<ExpressionPtr>, Cases, IPLVector<ExpressionPtr>())\
+ MACRO(ExpressionPtr, DefaultCase, nullptr)
+
+#define WHILE_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(ExpressionPtr, Condition, nullptr)\
+ MACRO(ExpressionPtr, Body, nullptr)\
+ MACRO(bool, DoWhile, false)
+
+#define FOR_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(ExpressionPtr, Initialization, nullptr)\
+ MACRO(ExpressionPtr, Condition, nullptr)\
+ MACRO(ExpressionPtr, Iteration, nullptr)\
+ MACRO(ExpressionPtr, Body, nullptr)
+
+#define FUNCTION_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(IPLString, Name, "")\
+ MACRO(IPLVector<IPLString>, ArgumentsIdentifiers, IPLVector<IPLString>())\
+ MACRO(ExpressionPtr, Body, nullptr)
+
+#define TOP_EXPRESSION_MEMBERS(MACRO)\
+ MACRO(IPLVector<ExpressionPtr>, Values, IPLVector<ExpressionPtr>())
+
+#define EMPTY_EXPRESSION_MEMBERS(MACRO)
+
+#define EXPRESSION_DEFINITION_ITERATOR(MACRO)\
+ MACRO(BinaryExpression, Expression, BINARY_EXPRESSION_MEMBERS)\
+ MACRO(UnaryExpression, Expression, UNARY_EXPRESSION_MEMBERS)\
+ MACRO(IdentifierExpression, Expression, IDENTIFIER_EXPRESSION_MEMBERS)\
+ MACRO(VariableDefinitionExpression, Expression, VARIABLEDEFINITION_EXPRESSION_MEMBERS)\
+ MACRO(ListExpression, Expression, LIST_EXPRESSION_MEMBERS)\
+ MACRO(BlockStatement, Expression, BLOCK_EXPRESSION_MEMBERS)\
+ MACRO(LabeledStatement, Expression, LABELED_EXPRESSION_MEMBERS)\
+ MACRO(IfStatement, Expression, IF_EXPRESSION_MEMBERS)\
+ MACRO(SwitchStatement, Expression, SWITCH_EXPRESSION_MEMBERS)\
+ MACRO(CaseStatement, Expression, CASE_EXPRESSION_MEMBERS)\
+ MACRO(WhileStatement, Expression, WHILE_EXPRESSION_MEMBERS)\
+ MACRO(ForStatement, Expression, FOR_EXPRESSION_MEMBERS)\
+ MACRO(FunctionDeclaration, Expression, FUNCTION_EXPRESSION_MEMBERS)\
+ MACRO(TopStatements, Expression, TOP_EXPRESSION_MEMBERS)\
+ MACRO(EmptyExpression, Expression, EMPTY_EXPRESSION_MEMBERS)
+
+
+EXPRESSION_DEFINITION_ITERATOR(GENERATE_EXPRESSION);
inline ExpressionPtr CreateEmptyExpression() { return IPLMakeSharePtr<EmptyExpression>(); }