#include "alfe/main.h"
#ifndef INCLUDED_OPERATOR_H
#define INCLUDED_OPERATOR_H
#include "alfe/nullary.h"
class Operator : public ConstHandle
{
public:
Operator() { }
Operator(const ConstHandle& other) : ConstHandle(other) { }
String toString() const { return body()->toString(); }
Operator parse(CharacterSource* source, Span* span) const
{
if (Space::parseOperator(source, toString(), span))
return *this;
return Operator();
}
bool operator==(const Operator& other) const
{
// All the bodies are nullary
return body() == other.body();
}
protected:
class Body : public ConstHandle::Body
{
public:
virtual String toString() const = 0;
};
const Body* body() const { return as
(); }
};
class OperatorEqualTo : public NamedNullary
{
public:
static String name() { return "=="; }
};
class OperatorAssignment : public NamedNullary
{
public:
static String name() { return "="; }
};
class OperatorAddAssignment
: public NamedNullary
{
public:
static String name() { return "+="; }
};
class OperatorSubtractAssignment
: public NamedNullary
{
public:
static String name() { return "-="; }
};
class OperatorMultiplyAssignment
: public NamedNullary
{
public:
static String name() { return "*="; }
};
class OperatorDivideAssignment
: public NamedNullary
{
public:
static String name() { return "/="; }
};
class OperatorModuloAssignment
: public NamedNullary
{
public:
static String name() { return "%="; }
};
class OperatorShiftLeftAssignment
: public NamedNullary
{
public:
static String name() { return "<<="; }
};
class OperatorShiftRightAssignment
: public NamedNullary
{
public:
static String name() { return ">>="; }
};
class OperatorBitwiseAndAssignment
: public NamedNullary
{
public:
static String name() { return "&="; }
};
class OperatorBitwiseOrAssignment
: public NamedNullary
{
public:
static String name() { return "|="; }
};
class OperatorBitwiseXorAssignment
: public NamedNullary
{
public:
static String name() { return "~="; }
};
class OperatorPowerAssignment
: public NamedNullary
{
public:
static String name() { return "^="; }
};
class OperatorAmpersand : public NamedNullary
{
public:
static String name() { return "&"; }
};
class OperatorBitwiseOr : public NamedNullary
{
public:
static String name() { return "|"; }
};
class OperatorTwiddle : public NamedNullary
{
public:
static String name() { return "~"; }
};
class OperatorNot : public NamedNullary
{
public:
static String name() { return "!"; }
};
class OperatorNotEqualTo : public NamedNullary
{
public:
static String name() { return "!="; }
};
class OperatorLessThan : public NamedNullary
{
public:
static String name() { return "<"; }
};
class OperatorGreaterThan : public NamedNullary
{
public:
static String name() { return ">"; }
};
class OperatorLessThanOrEqualTo
: public NamedNullary
{
public:
static String name() { return "<="; }
};
class OperatorGreaterThanOrEqualTo
: public NamedNullary
{
public:
static String name() { return ">="; }
};
class OperatorShiftLeft : public NamedNullary
{
public:
static String name() { return "<<"; }
};
class OperatorShiftRight : public NamedNullary
{
public:
static String name() { return ">>"; }
};
class OperatorPlus : public NamedNullary
{
public:
static String name() { return "+"; }
};
class OperatorMinus : public NamedNullary
{
public:
static String name() { return "-"; }
};
class OperatorStar : public NamedNullary
{
public:
static String name() { return "*"; }
};
class OperatorDivide : public NamedNullary
{
public:
static String name() { return "/"; }
};
class OperatorModulo : public NamedNullary
{
public:
static String name() { return "%"; }
};
class OperatorPower : public NamedNullary
{
public:
static String name() { return "^"; }
};
class OperatorFunctionCall
: public NamedNullary
{
public:
static String name() { return "()"; }
};
class OperatorIndex : public NamedNullary
{
public:
static String name() { return "[]"; }
};
class OperatorIncrement : public NamedNullary
{
public:
static String name() { return "++"; }
};
class OperatorDecrement : public NamedNullary
{
public:
static String name() { return "--"; }
};
#endif // INCLUDED_OPERATOR_H