2014-04-28 21:09:25 +04:00
|
|
|
#pragma once
|
2010-01-30 07:26:05 +03:00
|
|
|
|
2011-09-03 08:10:36 +04:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
2012-03-28 02:05:00 +04:00
|
|
|
#include "value.h"
|
2013-04-19 02:34:14 +04:00
|
|
|
#include "typedefs.h"
|
2010-01-30 07:26:05 +03:00
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class Expression
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
std::vector<Expression*> children;
|
2014-11-25 19:26:14 +03:00
|
|
|
Expression *first;
|
|
|
|
Expression *second;
|
|
|
|
Expression *third;
|
2014-11-25 01:37:42 +03:00
|
|
|
|
|
|
|
Expression();
|
|
|
|
Expression(Expression *expr);
|
|
|
|
Expression(Expression *left, Expression *right);
|
|
|
|
Expression(Expression *expr1, Expression *expr2, Expression *expr3);
|
|
|
|
virtual ~Expression();
|
|
|
|
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual bool isListComprehension() const;
|
2014-11-25 01:37:42 +03:00
|
|
|
virtual ValuePtr evaluate(const class Context *context) const = 0;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const = 0;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
std::ostream &operator<<(std::ostream &stream, const Expression &expr);
|
2014-11-24 02:52:46 +03:00
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionNot : public Expression
|
2014-11-24 02:52:46 +03:00
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionNot(Expression *expr);
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual ValuePtr evaluate(const class Context *context) const;
|
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-24 02:52:46 +03:00
|
|
|
};
|
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionLogicalAnd : public Expression
|
2014-11-24 02:52:46 +03:00
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionLogicalAnd(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-24 02:52:46 +03:00
|
|
|
};
|
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionLogicalOr : public Expression
|
2010-01-30 07:26:05 +03:00
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionLogicalOr(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
2010-01-30 07:26:05 +03:00
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionMultiply : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionMultiply(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
2010-01-30 07:26:05 +03:00
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionDivision : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionDivision(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
2010-01-30 07:26:05 +03:00
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionModulo : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionModulo(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
2014-11-24 02:52:46 +03:00
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionPlus : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionPlus(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
2014-11-24 02:52:46 +03:00
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionMinus : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionMinus(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
2014-11-24 02:52:46 +03:00
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionLess : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionLess(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2010-01-30 07:26:05 +03:00
|
|
|
};
|
|
|
|
|
2014-11-25 01:37:42 +03:00
|
|
|
class ExpressionLessOrEqual : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionLessOrEqual(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionEqual : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionEqual(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionNotEqual : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionNotEqual(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionGreaterOrEqual : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionGreaterOrEqual(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionGreater : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionGreater(Expression *left, Expression *right);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionTernary : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionTernary(Expression *expr1, Expression *expr2, Expression *expr3);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
2014-11-25 23:05:36 +03:00
|
|
|
class ExpressionArrayLookup : public Expression
|
2014-11-25 01:37:42 +03:00
|
|
|
{
|
|
|
|
public:
|
2014-11-25 23:05:36 +03:00
|
|
|
ExpressionArrayLookup(Expression *left, Expression *right);
|
2014-11-25 19:26:14 +03:00
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-26 01:08:14 +03:00
|
|
|
private:
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionInvert : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionInvert(Expression *expr);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionConst : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionConst(const ValuePtr &val);
|
|
|
|
ValuePtr evaluate(const class Context *) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-26 01:08:14 +03:00
|
|
|
private:
|
|
|
|
ValuePtr const_value;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionRange : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionRange(Expression *expr1, Expression *expr2);
|
|
|
|
ExpressionRange(Expression *expr1, Expression *expr2, Expression *expr3);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionVector : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionVector(Expression *expr);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionLookup : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-26 01:08:14 +03:00
|
|
|
ExpressionLookup(const std::string &var_name);
|
2014-11-25 19:26:14 +03:00
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-26 01:08:14 +03:00
|
|
|
private:
|
|
|
|
std::string var_name;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionMember : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-26 01:08:14 +03:00
|
|
|
ExpressionMember(Expression *expr, const std::string &member);
|
2014-11-25 19:26:14 +03:00
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-26 01:08:14 +03:00
|
|
|
private:
|
|
|
|
std::string member;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
2014-11-26 01:08:14 +03:00
|
|
|
class ExpressionFunctionCall : public Expression
|
2014-11-25 01:37:42 +03:00
|
|
|
{
|
|
|
|
public:
|
2014-11-26 01:08:14 +03:00
|
|
|
ExpressionFunctionCall(const std::string &funcname, const AssignmentList &arglist);
|
2014-11-25 19:26:14 +03:00
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-26 01:08:14 +03:00
|
|
|
public:
|
|
|
|
std::string funcname;
|
|
|
|
AssignmentList call_arguments;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionLet : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-26 01:08:14 +03:00
|
|
|
ExpressionLet(const AssignmentList &arglist, Expression *expr);
|
2014-11-25 19:26:14 +03:00
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-26 01:08:14 +03:00
|
|
|
private:
|
|
|
|
AssignmentList call_arguments;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionLcExpression : public Expression
|
|
|
|
{
|
|
|
|
public:
|
2014-11-25 19:26:14 +03:00
|
|
|
ExpressionLcExpression(Expression *expr);
|
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
class ExpressionLc : public Expression
|
|
|
|
{
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual bool isListComprehension() const;
|
2014-11-25 01:37:42 +03:00
|
|
|
public:
|
2014-11-26 01:08:14 +03:00
|
|
|
ExpressionLc(const std::string &name,
|
|
|
|
const AssignmentList &arglist, Expression *expr);
|
|
|
|
ExpressionLc(const std::string &name,
|
|
|
|
Expression *expr1, Expression *expr2);
|
2014-11-25 19:26:14 +03:00
|
|
|
ValuePtr evaluate(const class Context *context) const;
|
2014-11-25 23:05:36 +03:00
|
|
|
virtual void print(std::ostream &stream) const;
|
2014-11-26 01:08:14 +03:00
|
|
|
private:
|
|
|
|
std::string name;
|
|
|
|
AssignmentList call_arguments;
|
2014-11-25 01:37:42 +03:00
|
|
|
};
|