#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