#ifdef HAVE_CONFIG_H # include #endif #include "operator.hh" #include #include int Operator::all_flags[opLast]; int Operator::all_precedence[opLast]; Operator Operator::all_terminator[opLast]; PermString Operator::all_name[opLast - 256]; void Operator::set_data(PermString name) { assert(_op >= 0 && _op < opLast); if (_op >= 256) all_name[_op - 256] = name; all_precedence[_op] = -1; all_flags[_op] = 0; all_terminator[_op] = 0; } void Operator::set_data(PermString name, int precedence, int flags, Operator terminator) { assert(_op >= 0 && _op < opLast && !all_precedence[_op]); if (_op >= 256) all_name[_op - 256] = name; all_precedence[_op] = precedence; all_flags[_op] = flags; all_terminator[_op] = terminator; // now test some flags for internal consistency if (terminator) assert(prefix() || !unary()); if (takes_id()) assert(!terminator && !prefix()); if (functionish()) assert(prefix()); } PermString Operator::name() const { if (_op < 256) { char x = _op; return PermString(&x, 1); } else { assert(_op < opLast); return all_name[_op - 256]; } } /***** * OperatorGroup **/ OperatorGroup::OperatorGroup() : _ops(new Operator[4]), _nops(0) { } OperatorGroup::~OperatorGroup() { delete[] _ops; } void OperatorGroup::add(Operator op) { if (_nops && (_nops % 4) == 0) { Operator *new_ops = new Operator[_nops + 4]; memcpy(new_ops, _ops, sizeof(Operator) * _nops); delete[] _ops; _ops = new_ops; } _ops[_nops++] = op; } Operator OperatorGroup::find(bool is_prefix) { for (int i = 0; i < _nops; i++) if (_ops[i].prefix() == is_prefix) return _ops[i]; return opNone; }