| 1 | /*============================================================================= |
| 2 | Copyright (c) 2001-2011 Joel de Guzman |
| 3 | Copyright (c) 2001-2011 Hartmut Kaiser |
| 4 | |
| 5 | Distributed under the Boost Software License, Version 1.0. (See accompanying |
| 6 | file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| 7 | =============================================================================*/ |
| 8 | #if !defined(BOOST_SPIRIT_CONJURE_IDS_HPP) |
| 9 | #define BOOST_SPIRIT_CONJURE_IDS_HPP |
| 10 | |
| 11 | namespace client |
| 12 | { |
| 13 | struct op_type |
| 14 | { |
| 15 | enum type |
| 16 | { |
| 17 | binary = 0x20000, |
| 18 | unary = 0x40000, |
| 19 | postfix_unary = 0x80000, |
| 20 | assign = 0x100000 |
| 21 | }; |
| 22 | }; |
| 23 | |
| 24 | struct op |
| 25 | { |
| 26 | enum type |
| 27 | { |
| 28 | // binary |
| 29 | comma, |
| 30 | assign, |
| 31 | plus_assign, |
| 32 | minus_assign, |
| 33 | times_assign, |
| 34 | divide_assign, |
| 35 | mod_assign, |
| 36 | bit_and_assign, |
| 37 | bit_xor_assign, |
| 38 | bit_or_assign, |
| 39 | shift_left_assign, |
| 40 | shift_right_assign, |
| 41 | logical_or, |
| 42 | logical_and, |
| 43 | bit_or, |
| 44 | bit_xor, |
| 45 | bit_and, |
| 46 | equal, |
| 47 | not_equal, |
| 48 | less, |
| 49 | less_equal, |
| 50 | greater, |
| 51 | greater_equal, |
| 52 | shift_left, |
| 53 | shift_right, |
| 54 | plus, |
| 55 | minus, |
| 56 | times, |
| 57 | divide, |
| 58 | mod, |
| 59 | |
| 60 | // unary |
| 61 | plus_plus, |
| 62 | minus_minus, |
| 63 | compl_, |
| 64 | not_, |
| 65 | }; |
| 66 | }; |
| 67 | |
| 68 | template <int type, int op> |
| 69 | struct make_op |
| 70 | { |
| 71 | static int const value = type + op; |
| 72 | }; |
| 73 | |
| 74 | template <op::type op> |
| 75 | struct unary_op : make_op<op_type::unary, op> {}; |
| 76 | |
| 77 | template <op::type op> |
| 78 | struct binary_op |
| 79 | : make_op<op_type::binary, op> {}; |
| 80 | |
| 81 | template <op::type op> |
| 82 | struct assign_op |
| 83 | : make_op<op_type::assign, op> {}; |
| 84 | |
| 85 | template <op::type op> |
| 86 | struct binary_or_unary_op |
| 87 | : make_op<op_type::unary | op_type::binary, op> {}; |
| 88 | |
| 89 | struct token_ids |
| 90 | { |
| 91 | enum type |
| 92 | { |
| 93 | // pseudo tags |
| 94 | invalid = -1, |
| 95 | op_binary = op_type::binary, |
| 96 | op_unary = op_type::unary, |
| 97 | op_assign = op_type::assign, |
| 98 | |
| 99 | // binary / unary operators with common tokens |
| 100 | // '+' and '-' can be binary or unary |
| 101 | // (the lexer cannot distinguish which) |
| 102 | plus = binary_or_unary_op<op::plus>::value, |
| 103 | minus = binary_or_unary_op<op::minus>::value, |
| 104 | |
| 105 | // binary operators |
| 106 | comma = binary_op<op::comma>::value, |
| 107 | assign = assign_op<op::assign>::value, |
| 108 | plus_assign = assign_op<op::plus_assign>::value, |
| 109 | minus_assign = assign_op<op::minus_assign>::value, |
| 110 | times_assign = assign_op<op::times_assign>::value, |
| 111 | divide_assign = assign_op<op::divide_assign>::value, |
| 112 | mod_assign = assign_op<op::mod_assign>::value, |
| 113 | bit_and_assign = assign_op<op::bit_and_assign>::value, |
| 114 | bit_xor_assign = assign_op<op::bit_xor_assign>::value, |
| 115 | bit_or_assign = assign_op<op::bit_or_assign>::value, |
| 116 | shift_left_assign = assign_op<op::shift_left_assign>::value, |
| 117 | shift_right_assign = assign_op<op::shift_right_assign>::value, |
| 118 | logical_or = binary_op<op::logical_or>::value, |
| 119 | logical_and = binary_op<op::logical_and>::value, |
| 120 | bit_or = binary_op<op::bit_or>::value, |
| 121 | bit_xor = binary_op<op::bit_xor>::value, |
| 122 | bit_and = binary_op<op::bit_and>::value, |
| 123 | equal = binary_op<op::equal>::value, |
| 124 | not_equal = binary_op<op::not_equal>::value, |
| 125 | less = binary_op<op::less>::value, |
| 126 | less_equal = binary_op<op::less_equal>::value, |
| 127 | greater = binary_op<op::greater>::value, |
| 128 | greater_equal = binary_op<op::greater_equal>::value, |
| 129 | shift_left = binary_op<op::shift_left>::value, |
| 130 | shift_right = binary_op<op::shift_right>::value, |
| 131 | times = binary_op<op::times>::value, |
| 132 | divide = binary_op<op::divide>::value, |
| 133 | mod = binary_op<op::mod>::value, |
| 134 | |
| 135 | // unary operators with overlaps |
| 136 | // '++' and '--' can be prefix or postfix |
| 137 | // (the lexer cannot distinguish which) |
| 138 | plus_plus = make_op< |
| 139 | op_type::unary |
| 140 | | op_type::postfix_unary, op::plus_plus>::value, |
| 141 | |
| 142 | minus_minus = make_op< |
| 143 | op_type::unary |
| 144 | | op_type::postfix_unary, op::minus_minus>::value, |
| 145 | |
| 146 | // unary operators |
| 147 | compl_ = unary_op<op::compl_>::value, |
| 148 | not_ = unary_op<op::not_>::value, |
| 149 | |
| 150 | // misc tags |
| 151 | identifier = op::not_ + 1, |
| 152 | , |
| 153 | whitespace, |
| 154 | lit_uint, |
| 155 | true_or_false |
| 156 | }; |
| 157 | }; |
| 158 | } |
| 159 | |
| 160 | #endif |
| 161 | |