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
11namespace 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 comment,
153 whitespace,
154 lit_uint,
155 true_or_false
156 };
157 };
158}
159
160#endif
161

source code of boost/libs/spirit/example/qi/compiler_tutorial/conjure3/ids.hpp