1 #ifndef FIPA_ACL_GRAMMAR_STRING_MESSAGE_H
2 #define FIPA_ACL_GRAMMAR_STRING_MESSAGE_H
4 #include <fipa_acl/message_parser/grammar/grammar_common.h>
5 #include <fipa_acl/message_generator/message_format.h>
12 template<
typename Iterator>
13 struct Keyword : qi::grammar<Iterator, std::string()>
17 using namespace fipa::acl::MessageField;
33 | qi::lit(
":resolvers")
34 | qi::lit(
":addresses")
40 qi::rule<Iterator, std::string()>
keyword;
43 template<
typename Iterator>
48 using encoding::char_;
50 word_rule = (char_ - wordExceptionsStart ) [ label::_val += label::_1 ]
51 >> *(!
keyword >> (char_ - wordExceptionsGeneral) [ label::_val += label::_1 ]
54 wordExceptionsStart %= wordExceptionsGeneral
60 wordExceptionsGeneral %= char_(0x00,0x20)
73 template<
typename Iterator>
74 struct Url : qi::grammar<Iterator, std::string()>
76 Url() :
Url::base_type(url,
"url-string_grammar")
78 using encoding::char_;
82 url = wordWithoutKeyword [ label::_val += label::_1 ]
89 qi::rule<Iterator, std::string()>
url;
92 template<
typename Iterator,
typename Skipper = qi::unused_type>
93 struct UrlSequence : qi::grammar<Iterator, std::vector<std::string>(), Skipper>
98 urlSequence = qi::lit(
"(")
99 >> qi::no_case[qi::lit(
"sequence")]
100 >> * url [ phoenix::push_back(label::_val, label::_1) ]
107 qi::rule<Iterator, std::vector<std::string>(), Skipper> urlSequence;
111 template<
typename Iterator>
112 struct Number : qi::grammar<Iterator, std::string() >
116 using encoding::char_;
118 number = float_number [ label::_val = label::_1 ]
119 | integer_number [ label::_val = label::_1 ]
122 integer_number = - sign [ label::_val = label::_1 ]
123 >> +digit [ label::_val += label::_1 ]
126 sign = encoding::string(
"+")
127 | encoding::string(
"-");
129 digit = char_(
'0',
'9');
131 float_number = (-sign [ label::_val = label::_1 ]
132 >> float_mantissa [ label::_val += label::_1 ]
133 >> - float_exponent [ label::_val += label::_1 ]
135 | ( -sign [ label::_val = label::_1 ]
136 >> +digit [ label::_val += label::_1 ]
137 >> float_exponent [ label::_val += label::_1 ]
140 float_mantissa = ( +digit [ label::_val = label::_1 ]
141 >> char_(
'.') [ label::_val += label::_1 ]
142 >> *digit [ label::_val += label::_1 ]
144 | ( *digit [ label::_val = label::_1 ]
145 >> char_(
'.') [ label::_val += label::_1 ]
146 >> +digit [ label::_val += label::_1 ]
149 float_exponent = exponent [ label::_val = label::_1 ]
150 >> - sign [ label::_val += label::_1 ]
151 >> +digit [ label::_val += label::_1 ]
154 exponent = encoding::string(
"e")
155 | encoding::string(
"E");
164 qi::rule<Iterator, std::string()>
sign;
170 qi::rule<Iterator, std::string()>
number;
173 template<
typename Iterator>
178 using encoding::char_;
180 date_time = - sign [ label::_val = label::_1 ]
181 >> year [ label::_val += label::_1 ]
182 >> month [ label::_val += label::_1 ]
183 >> day [ label::_val += label::_1 ]
184 >> char_(
'T') [ label::_val += label::_1 ]
185 >> hour [ label::_val += label::_1 ]
186 >> minute [ label::_val += label::_1 ]
187 >> second [ label::_val += label::_1 ]
188 >> millisecond [ label::_val += label::_1 ]
189 >> - typeDesignator [ label::_val += label::_1 ]
192 sign = encoding::string(
"+")
193 | encoding::string(
"-");
195 typeDesignator = char_(
'a',
'z')
198 digit = char_(
'0',
'9');
209 hour = month.alias();
210 minute = month.alias();
211 second = month.alias();
222 qi::rule<Iterator, std::string()>
year;
223 qi::rule<Iterator, std::string()>
month;
224 qi::rule<Iterator, std::string()>
day;
225 qi::rule<Iterator, std::string()>
hour;
226 qi::rule<Iterator, std::string()>
minute;
227 qi::rule<Iterator, std::string()>
second;
230 qi::rule<Iterator, std::string()>
sign;
237 template<
typename Iterator>
238 struct DateTime : qi::grammar<Iterator, base::Time() >
253 template<
typename Iterator,
typename Skipper = qi::unused_type>
254 struct Expression : qi::grammar<Iterator, std::string(), Skipper>
259 using phoenix::construct;
261 using encoding::char_;
263 using namespace fipa::acl;
264 namespace label = qi::labels;
266 expression = expression_base [ label::_val = label::_1 ]
273 expression_base =
string
289 template<
typename Iterator>
290 struct UserdefinedParameter : qi::grammar<Iterator, fipa::acl::UserdefParam(), qi::locals<std::string, std::string> >
295 using phoenix::construct;
298 using namespace fipa::acl;
299 namespace label = qi::labels;
301 param = (paramLabel [ label::_a = label::_1 ]
302 >> expression [ label::_b = label::_1 ]
303 ) [ label::_val = phoenix::construct<fipa::acl::UserdefParam>(label::_a, label::_b)]
306 paramLabel = qi::lit(
":X-")
310 >> wordWithoutKeyword [ label::_val = label::_1 ]
317 qi::rule<Iterator, fipa::acl::UserdefParam(), qi::locals<std::string,std::string> >
param;
320 template<
typename Iterator>
326 using namespace fipa::acl;
327 namespace label = qi::labels;
329 param_list = +userdefinedParam [ phoenix::push_back(label::_val, label::_1)]
334 qi::rule<Iterator, std::vector<fipa::acl::UserdefParam>() > param_list;
337 template<
typename Iterator,
typename Skipper = qi::unused_type>
338 struct Resolver : qi::grammar<Iterator, fipa::acl::AgentID(), Skipper>
343 using namespace fipa::acl;
344 namespace label = qi::labels;
346 agentId = qi::lit(
"(")
347 >> qi::no_case[qi::lit(
"agent-identifier")]
348 >> qi::no_case[qi::lit(
":name")] >> word [ phoenix::at_c<0>(label::_val) = label::_1 ]
349 >> - (qi::no_case[qi::lit(
":addresses")] >> urlSequence [ phoenix::at_c<1>(label::_val) = label::_1 ])
351 >> - (userdefinedParameterList [ phoenix::at_c<3>(label::_val) = label::_1 ])
361 qi::rule<Iterator, fipa::acl::AgentID(), Skipper>
agentId;
364 template<
typename Iterator,
typename Skipper = qi::unused_type>
370 using namespace fipa::acl;
371 namespace label = qi::labels;
373 agentIdList = qi::lit(
"(")
374 >> qi::no_case[qi::lit(
"sequence")]
375 >> * agentIdentifier [ phoenix::push_back(label::_val, label::_1) ]
382 qi::rule<Iterator, fipa::acl::AgentIDList(), Skipper>
agentIdList;
386 template<
typename Iterator,
typename Skipper = qi::unused_type>
392 using namespace fipa::acl;
393 namespace label = qi::labels;
395 agentId = qi::lit(
"(")
396 >> qi::no_case[qi::lit(
"agent-identifier")]
397 >> qi::no_case[qi::lit(
":name")] >> word [ phoenix::at_c<0>(label::_val) = label::_1 ]
398 >> -( qi::no_case[qi::lit(
":addresses")] >> urlSequence [ phoenix::at_c<1>(label::_val) = label::_1 ])
399 >> -( qi::no_case[qi::lit(
":resolvers")] >> agentIdSequence [ phoenix::at_c<2>(label::_val) = label::_1 ])
400 >> - (userdefinedParameterList [ phoenix::at_c<3>(label::_val) = label::_1 ])
410 qi::rule<Iterator, fipa::acl::AgentID(), Skipper>
agentId;
414 template<
typename Iterator,
typename Skipper = qi::unused_type>
420 using namespace fipa::acl;
421 namespace label = qi::labels;
423 agentIdList = qi::lit(
"(")
424 >> qi::no_case[qi::lit(
"set")]
425 >> * agentIdentifier [ phoenix::push_back(label::_val, label::_1) ]
432 qi::rule<Iterator, fipa::acl::AgentIDList(), Skipper>
agentIdList;
436 template<
typename Iterator,
typename Skipper = qi::unused_type >
437 struct Message : qi::grammar<Iterator, fipa::acl::ACLMessage(), Skipper>
441 using namespace fipa::acl;
442 using namespace MessageField;
445 namespace label = qi::labels;
447 aclCommunicativeAct =
"("
448 >> messageType [ phoenix::at_c<0>(label::_val) = label::_1 ]
460 | qi::lit(
":" +
MessageFieldTxt[
PROTOCOL]) >> wordWithoutKeyword [ phoenix::at_c<11>(label::_val) = label::_1 ]
462 | userdefinedParam [ phoenix::at_c<13>(label::_val) = label::_1 ]
466 messageType = qi::no_case[
515 #endif //FIPA_ACL_GRAMMAR_STRING_MESSAGE_H
phoenix::function< concatStringsWithSeparatorImpl > concatStringsWithSeparator
qi::rule< Iterator, fipa::acl::ACLMessage(), Skipper > aclCommunicativeAct
qi::rule< Iterator, std::string()> paramLabel
WordWithoutKeyword< Iterator > wordWithoutKeyword
qi::rule< Iterator, std::string()> url
UserdefinedParameterList< Iterator > userdefinedParameterList
UrlSequence< Iterator, Skipper > urlSequence
qi::rule< Iterator, std::string()> sign
DateTime< Iterator > dateTime
AgentIdentifier< Iterator, Skipper > agentIdentifier
qi::rule< Iterator, std::string()> minute
qi::rule< Iterator, std::string()> sign
qi::rule< Iterator, fipa::acl::UserdefParam(), qi::locals< std::string, std::string > > param
qi::rule< Iterator, std::string()> integer_number
qi::rule< Iterator, std::string()> messageType
qi::rule< Iterator, std::string()> date_time
grammar::String< Iterator > content
qi::rule< Iterator, std::string()> float_number
qi::rule< Iterator, std::string()> float_exponent
WordWithoutKeyword< Iterator > wordWithoutKeyword
qi::rule< Iterator, std::string()> second
std::map< MessageField::Type, std::string > MessageFieldTxt
qi::rule< Iterator, std::string()> month
qi::rule< Iterator, std::string()> year
DateTimeToken< Iterator > dateTime
UserdefinedParameterList< Iterator > userdefinedParameterList
qi::rule< Iterator, std::string()> keyword
grammar::Word< Iterator > word
qi::rule< Iterator, char()> typeDesignator
qi::rule< Iterator, std::string()> hour
qi::rule< Iterator, fipa::acl::AgentID(), Skipper > agentId
UserdefinedParameter< Iterator > userdefinedParam
Keyword< Iterator > keyword
AgentIdentifierSet< Iterator, Skipper > agentIdList
qi::rule< Iterator, std::string()> exponent
UserdefinedParameter< Iterator > userdefinedParam
qi::rule< Iterator, std::string()> float_mantissa
AgentIdentifier< Iterator, Skipper > agentId
AgentIdentifierSequence()
WordWithoutKeyword< Iterator > word
std::map< ACLMessage::Performative, std::string > PerformativeTxt
qi::rule< Iterator, fipa::acl::AgentID(), Skipper > agentId
AgentIdentifierSequence< Iterator, Skipper > agentIdSequence
phoenix::function< convertToBaseTimeImpl > convertToBaseTime
qi::rule< Iterator, fipa::acl::AgentIDList(), Skipper > agentIdList
qi::rule< Iterator > wordExceptionsGeneral
WordWithoutKeyword< Iterator > wordWithoutKeyword
UserdefinedParameterList()
qi::rule< Iterator, fipa::acl::AgentIDList(), Skipper > agentIdList
qi::rule< Iterator, std::string()> number
qi::rule< Iterator, std::string()> day
Number< Iterator > number
qi::rule< Iterator, std::string()> expression_base
DateTimeToken< Iterator > dateTime
qi::rule< Iterator, std::string()> millisecond
grammar::String< Iterator > string
WordWithoutKeyword< Iterator > word
#define FIPA_DEBUG_RULE(X)
Expression< Iterator > expression
qi::rule< Iterator, char()> digit
qi::rule< Iterator, std::string()> word_rule
Expression< Iterator > expression
qi::rule< Iterator, char()> digit
qi::rule< Iterator, std::string(), Skipper > expression
qi::rule< Iterator, base::Time()> date_time
UrlSequence< Iterator, Skipper > urlSequence
qi::rule< Iterator > wordExceptionsStart
Resolver< Iterator, Skipper > agentIdentifier
Expression< Iterator, Skipper > expression
WordWithoutKeyword< Iterator > wordWithoutKeyword