123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- /*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
- Copyright (c) 2001-2011 Hartmut Kaiser
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- =============================================================================*/
- #if !defined(BOOST_SPIRIT_CONJURE_IDS_HPP)
- #define BOOST_SPIRIT_CONJURE_IDS_HPP
- namespace client
- {
- struct op_type
- {
- enum type
- {
- binary = 0x20000,
- unary = 0x40000,
- postfix_unary = 0x80000,
- assign = 0x100000
- };
- };
- struct op
- {
- enum type
- {
- // binary
- comma,
- assign,
- plus_assign,
- minus_assign,
- times_assign,
- divide_assign,
- mod_assign,
- bit_and_assign,
- bit_xor_assign,
- bit_or_assign,
- shift_left_assign,
- shift_right_assign,
- logical_or,
- logical_and,
- bit_or,
- bit_xor,
- bit_and,
- equal,
- not_equal,
- less,
- less_equal,
- greater,
- greater_equal,
- shift_left,
- shift_right,
- plus,
- minus,
- times,
- divide,
- mod,
- // unary
- plus_plus,
- minus_minus,
- compl_,
- not_,
- };
- };
- template <int type, int op>
- struct make_op
- {
- static int const value = type + op;
- };
- template <op::type op>
- struct unary_op : make_op<op_type::unary, op> {};
- template <op::type op>
- struct binary_op
- : make_op<op_type::binary, op> {};
- template <op::type op>
- struct assign_op
- : make_op<op_type::assign, op> {};
- template <op::type op>
- struct binary_or_unary_op
- : make_op<op_type::unary | op_type::binary, op> {};
- struct token_ids
- {
- enum type
- {
- // pseudo tags
- invalid = -1,
- op_binary = op_type::binary,
- op_unary = op_type::unary,
- op_assign = op_type::assign,
- // binary / unary operators with common tokens
- // '+' and '-' can be binary or unary
- // (the lexer cannot distinguish which)
- plus = binary_or_unary_op<op::plus>::value,
- minus = binary_or_unary_op<op::minus>::value,
- // binary operators
- comma = binary_op<op::comma>::value,
- assign = assign_op<op::assign>::value,
- plus_assign = assign_op<op::plus_assign>::value,
- minus_assign = assign_op<op::minus_assign>::value,
- times_assign = assign_op<op::times_assign>::value,
- divide_assign = assign_op<op::divide_assign>::value,
- mod_assign = assign_op<op::mod_assign>::value,
- bit_and_assign = assign_op<op::bit_and_assign>::value,
- bit_xor_assign = assign_op<op::bit_xor_assign>::value,
- bit_or_assign = assign_op<op::bit_or_assign>::value,
- shift_left_assign = assign_op<op::shift_left_assign>::value,
- shift_right_assign = assign_op<op::shift_right_assign>::value,
- logical_or = binary_op<op::logical_or>::value,
- logical_and = binary_op<op::logical_and>::value,
- bit_or = binary_op<op::bit_or>::value,
- bit_xor = binary_op<op::bit_xor>::value,
- bit_and = binary_op<op::bit_and>::value,
- equal = binary_op<op::equal>::value,
- not_equal = binary_op<op::not_equal>::value,
- less = binary_op<op::less>::value,
- less_equal = binary_op<op::less_equal>::value,
- greater = binary_op<op::greater>::value,
- greater_equal = binary_op<op::greater_equal>::value,
- shift_left = binary_op<op::shift_left>::value,
- shift_right = binary_op<op::shift_right>::value,
- times = binary_op<op::times>::value,
- divide = binary_op<op::divide>::value,
- mod = binary_op<op::mod>::value,
- // unary operators with overlaps
- // '++' and '--' can be prefix or postfix
- // (the lexer cannot distinguish which)
- plus_plus = make_op<
- op_type::unary
- | op_type::postfix_unary, op::plus_plus>::value,
- minus_minus = make_op<
- op_type::unary
- | op_type::postfix_unary, op::minus_minus>::value,
- // unary operators
- compl_ = unary_op<op::compl_>::value,
- not_ = unary_op<op::not_>::value,
- // misc tags
- identifier = op::not_ + 1,
- comment,
- whitespace,
- lit_uint,
- true_or_false
- };
- };
- }
- #endif
|