1 #ifndef _FIPAACL_GRAMMAR_BITEFFICIENT_H_ 2 #define _FIPAACL_GRAMMAR_BITEFFICIENT_H_ 4 #include <fipa_acl/message_parser/grammar/grammar_common.h> 35 (std::vector<std::string>, addresses)
36 (std::vector<fipa::acl::Resolver>, resolvers)
37 (std::vector<fipa::acl::UserDefinedParameter>, parameters)
45 (std::vector<fipa::acl::message::Parameter>, parameters)
58 namespace bitefficient {
61 namespace label = qi::labels;
63 template<
typename Iterator>
64 struct EndOfCollection : qi::grammar<Iterator, qi::unused_type>
66 EndOfCollection() : EndOfCollection::base_type(eof_collection_rule,
"EndOfCollection-bitefficient_grammar")
68 eof_collection_rule = qi::byte_(0x01);
73 qi::rule<Iterator, qi::unused_type> eof_collection_rule;
76 template<
typename Iterator>
77 struct BinStringNoCodetable : qi::grammar<Iterator, fipa::acl::ByteSequence(), qi::locals<boost::uint_least32_t> >
79 BinStringNoCodetable() : BinStringNoCodetable::base_type(bin_string_no_codetable_rule,
"BinStringNoCodetable-bitefficient_grammar")
83 bin_string_no_codetable_rule = ( byte_(0x14) >> nullTerminatedString [ label::_val = label::_1 ])
85 | ( byte_(0x16) >> len8 [ label::_a = label::_1 ]
86 >> byteSeq(label::_a) [ phoenix::at_c<2>(label::_val) = label::_1] )
87 | ( byte_(0x17) >> len16 [ label::_a = label::_1 ]
88 >> byteSeq(label::_a) [ phoenix::at_c<2>(label::_val) = label::_1 ] )
89 | ( byte_(0x19) >> len32 [ label::_a = label::_1 ]
90 >> byteSeq(label::_a) [ phoenix::at_c<2>(label::_val) = label::_1 ] )
98 qi::rule<Iterator, fipa::acl::ByteSequence(), qi::locals<boost::uint_least32_t> > bin_string_no_codetable_rule;
100 Len16<Iterator> len16;
101 Len32<Iterator> len32;
102 qi::rule<Iterator, std::vector<unsigned char>(boost::uint_least32_t) > byteSeq;
103 NullTerminatedString<Iterator> nullTerminatedString;
106 template<
typename Iterator>
107 struct BinStringCodetable : qi::grammar<Iterator, fipa::acl::ByteSequence(), qi::locals<boost::uint_least32_t> >
109 BinStringCodetable() : BinStringCodetable::base_type(bin_string_codetable_rule,
"BinStringCodetable-bitefficient_grammar")
113 bin_string_codetable_rule =
122 qi::rule<Iterator, fipa::acl::ByteSequence(), qi::locals<boost::uint_least32_t> > bin_string_codetable_rule;
123 Index<Iterator> index;
127 template<
typename Iterator>
128 struct BinString : qi::grammar<Iterator, fipa::acl::ByteSequence() >
130 BinString() : BinString::base_type(bin_string_rule,
"BinString-bitefficient_grammar")
132 bin_string_rule = ( binStringNoCodetable | binStringCodetable) [ label::_val = label::_1];
137 qi::rule<Iterator, fipa::acl::ByteSequence()> bin_string_rule;
138 BinStringNoCodetable<Iterator> binStringNoCodetable;
139 BinStringCodetable<Iterator> binStringCodetable;
143 template<
typename Iterator>
144 struct BinNumber : qi::grammar<Iterator, std::string()>
146 BinNumber() : BinNumber::base_type(bin_number_rule,
"BinNumber-bitefficient_grammar")
152 bin_number_rule = ( byte_(0x12) >> digits [ label::_val = label::_1 ] )
159 qi::rule<Iterator, std::string()> bin_number_rule;
160 Digits<Iterator> digits;
163 template <
typename Iterator>
164 struct BinDateTime : qi::grammar<Iterator, fipa::acl::DateTime()>
166 BinDateTime() : BinDateTime::base_type(bin_date_time_rule,
"BinDateTime-bitefficient_grammar")
169 using encoding::alpha;
176 bin_date_time_rule = ( byte_(0x20) [ phoenix::at_c<0>(label::_val) =
' ' ]
177 >> binDate [ phoenix::at_c<1>(label::_val) = label::_1 ]
180 | ( byte_(0x21) [ phoenix::at_c<0>(label::_val) =
'+' ]
181 >> binDate [ phoenix::at_c<1>(label::_val) = label::_1 ]
184 | ( byte_(0x22) [ phoenix::at_c<0>(label::_val) =
'-' ]
185 >> binDate [ phoenix::at_c<1>(label::_val) = label::_1 ]
188 | ( byte_(0x24) [ phoenix::at_c<0>(label::_val) =
' ' ]
189 >> binDate [ phoenix::at_c<1>(label::_val) = label::_1 ]
190 >> typeDesignator [ phoenix::at_c<2>(label::_val) = label::_1 ]
193 | ( byte_(0x25) [ phoenix::at_c<0>(label::_val) =
'+' ]
194 >> binDate [ phoenix::at_c<1>(label::_val) = label::_1 ]
195 >> typeDesignator [ phoenix::at_c<2>(label::_val) = label::_1 ]
198 | ( byte_(0x26) [ phoenix::at_c<0>(label::_val) =
'-' ]
199 >> binDate [ phoenix::at_c<1>(label::_val) = label::_1 ]
200 >> typeDesignator [ phoenix::at_c<2>(label::_val) = label::_1 ]
205 typeDesignator = alpha [ label::_val = label::_1 ];
208 #ifdef BOOST_SPIRIT_DEBUG 209 BOOST_SPIRIT_DEBUG_NODE(typeDesignator);
214 qi::rule<Iterator, fipa::acl::DateTime() > bin_date_time_rule;
215 grammar::DateTime<Iterator> binDate;
216 qi::rule<Iterator, char() > typeDesignator;
221 template <
typename Iterator>
222 struct BinWord : qi::grammar<Iterator, std::string()>
224 BinWord() : BinWord::base_type(bin_word_rule,
"BinWord-bitefficient_grammar")
228 bin_word_rule = ( ( byte_(0x10)
229 >> word [ label::_val = label::_1 ]
237 qi::rule<Iterator, std::string()> bin_word_rule;
239 Index<Iterator> index;
242 template <
typename Iterator>
243 struct BinExpression : qi::grammar<Iterator, std::string()>
245 BinExpression() : BinExpression::base_type(bin_expression_rule,
"BinExpression-bitefficient_grammar")
249 using phoenix::construct;
254 using encoding::char_;
255 using encoding::string;
256 using encoding::digit;
257 using encoding::alpha;
260 bin_expression_rule = binExpr [ label::_val = label::_1 ]
261 | byte_(0xFF) >> binString [ label::_val =
convertToString(label::_1) ]
263 binExpr = binWord [ label::_val = label::_1 ]
265 | binNumber [ label::_val = label::_1 ]
267 | (exprStart [ label::_val =
"(" , label::_val += label::_1 ]
268 >> *binExpr [ label::_val += label::_1 ]
269 >> exprEnd [ label::_val +=
")", label::_val += label::_1 ]
273 exprStart = ( byte_(0x60) ) [ label::_val =
"" ]
274 | ( byte_(0x70) >> word [ label::_val = label::_1 ]
277 | ( byte_(0x72) >> digits [ label::_val = label::_1 ] )
278 | ( byte_(0x73) >> digits [ label::_val = label::_1 ] )
279 | ( byte_(0x74) >> ( stringLiteralTerminated
280 | byteLengthEncodedStringTerminated ) [ label::_val =
convertToString(label::_1) ] )
282 | ( byte_(0x76) >> len8 [ label::_a = label::_1 ]
284 | ( byte_(0x77) >> len16 [ label::_a = label::_1 ]
286 | ( byte_(0x78) >> len32 [ label::_a = label::_1 ]
291 exprEnd = ( byte_(0x40) ) [ label::_val =
"" ]
292 | ( byte_(0x50) >> word [ label::_val = label::_1 ]
295 | ( byte_(0x52) >> digits [ label::_val = label::_1 ] )
296 | ( byte_(0x53) >> digits [ label::_val = label::_1 ] )
297 | ( byte_(0x54) >> ( stringLiteralTerminated
298 | byteLengthEncodedStringTerminated ) [ label::_val =
convertToString(label::_1) ])
300 | ( byte_(0x56) >> len8 [ label::_a = label::_1 ]
302 | ( byte_(0x57) >> len16 [ label::_a = label::_1 ]
304 | ( byte_(0x58) >> len32 [ label::_a = label::_1 ]
311 fipaString = (stringLiteral | byteLengthEncodedString(label::_r1) );
313 byteLengthEncodedStringHeader = char_(
'#')
314 >> + digit [ label::_val += label::_1 ]
320 byteLengthEncodedString = byteLengthEncodedStringHeader [ phoenix::at_c<0>(label::_val) += label::_1 ]
321 >> qi::repeat(label::_r1)[byte_] [ phoenix::at_c<2>(label::_val) =
convertToString(label::_1) ]
324 #ifdef BOOST_SPIRIT_DEBUG 325 BOOST_SPIRIT_DEBUG_NODE(bin_expression_rule);
331 qi::rule<Iterator, std::string()> bin_expression_rule;
333 BinNumber<Iterator> binNumber;
334 BinWord<Iterator> binWord;
336 Index<Iterator> index;
338 Digits<Iterator> digits;
339 BinString<Iterator> binString;
341 BinDateTime<Iterator> binDateTime;
342 qi::rule<Iterator, std::string() > binExpr;
343 qi::rule<Iterator, std::string(), qi::locals<boost::uint_least32_t> > exprStart;
344 qi::rule<Iterator, std::string(), qi::locals<boost::uint_least32_t> > exprEnd;
348 qi::rule<Iterator, std::vector<unsigned char>(boost::uint32_t) > byteSeq;
350 Len16<Iterator> len16;
351 Len32<Iterator> len32;
353 qi::rule<Iterator, fipa::acl::ByteSequence(boost::uint32_t) > fipaString;
354 StringLiteral<Iterator> stringLiteral;
355 qi::rule<Iterator, fipa::acl::ByteSequence() > stringLiteralTerminated;
356 qi::rule<Iterator, std::string() > byteLengthEncodedStringHeader;
357 qi::rule<Iterator, fipa::acl::ByteSequence(boost::uint32_t) > byteLengthEncodedString;
358 ByteLengthEncodedStringTerminated<Iterator> byteLengthEncodedStringTerminated;
359 CodedNumber<Iterator> codedNumber;
362 template<
typename Iterator>
363 struct UserdefinedParameter : qi::grammar<Iterator, fipa::acl::UserDefinedParameter()>
365 UserdefinedParameter() : UserdefinedParameter::base_type(userdefined_parameter_rule,
"UserdefinedParameter-bitefficient_grammar")
367 userdefined_parameter_rule = qi::byte_(0x04)
368 >> binWord [ phoenix::at_c<0>(label::_val) = label::_1 ]
369 >> binExpression [ phoenix::at_c<1>(label::_val) = label::_1 ];
374 qi::rule<Iterator, fipa::acl::UserDefinedParameter() > userdefined_parameter_rule;
376 BinWord<Iterator> binWord;
377 BinExpression<Iterator> binExpression;
380 template<
typename Iterator>
381 struct AgentIdentifier : qi::grammar<Iterator, fipa::acl::AgentIdentifier()>
383 AgentIdentifier() : AgentIdentifier::base_type(agent_identifier_rule,
"AgentIdentifier-bitefficient_grammar")
387 agent_identifier_rule = byte_(0x02) >> agentName [ phoenix::at_c<0>(label::_val) = label::_1 ]
388 >> -addresses [ phoenix::at_c<1>(label::_val) = label::_1 ]
389 >> -resolvers [ phoenix::at_c<2>(label::_val) = label::_1 ]
390 >> *userDefinedParameter [ phoenix::push_back(phoenix::at_c<3>(label::_val), label::_1) ]
393 addresses = byte_(0x02) >> urlCollection [ label::_val = label::_1 ];
394 resolvers = byte_(0x03) >> *agent_identifier_rule [ phoenix::push_back(label::_val, label::_1) ]
397 urlCollection = *url [ phoenix::push_back(label::_val, label::_1) ]
401 endOfCollection %= byte_(0x01);
408 qi::rule<Iterator, fipa::acl::AgentIdentifier()> agent_identifier_rule;
409 BinWord<Iterator> agentName;
410 qi::rule<Iterator, std::vector<std::string>() > addresses;
411 qi::rule<Iterator, std::vector<fipa::acl::Resolver>() > resolvers;
412 UserdefinedParameter<Iterator> userDefinedParameter;
413 qi::rule<Iterator, std::vector<std::string>() > urlCollection;
414 BinWord<Iterator> url;
415 qi::rule<Iterator> endOfCollection;
418 template <
typename Iterator>
420 struct Message : qi::grammar<Iterator, fipa::acl::Message()>
423 Message() : Message::base_type(aclCommunicativeAct,
"message-bitefficient_grammar")
425 using phoenix::construct;
434 namespace label = qi::labels;
441 aclCommunicativeAct = header [ phoenix::at_c<0>(label::_val) = label::_1 ]
442 >> messageType [ phoenix::at_c<1>(label::_val) = label::_1 ]
443 >> *messageParameter [ phoenix::push_back(phoenix::at_c<2>(label::_val), label::_1) ]
447 header = messageId [ phoenix::at_c<0>(label::_val) = label::_1 ]
448 >> version [ phoenix::at_c<1>(label::_val) = label::_1 ]
452 messageId = byte_(0xFA) [ label::_val = 0xfa ]
453 | byte_(0xFB) [ label::_val = 0xfb ]
454 | byte_(0xFC) [ label::_val = 0xfc ]
459 endOfMessage %= endOfCollection;
460 endOfCollection %= byte_(0x01);
465 messageType = predefinedMessageType | userDefinedMessageType;
467 userDefinedMessageType = byte_(0x00)
468 >> messageTypeName [ label::_val = label::_1 ]
475 messageParameter = predefinedMessageParameter | userDefinedMessageParameter;
477 userDefinedMessageParameter = byte_(0x00)
478 >> parameterName [ phoenix::at_c<0>(label::_val) = label::_1 ]
479 >> parameterValue [ phoenix::at_c<1>(label::_val) = label::_1 ]
483 predefinedMessageType = byte_(0x01) [ label::_val =
"accept-proposal" ]
484 | byte_(0x02) [ label::_val =
"agree" ]
485 | byte_(0x03) [ label::_val =
"cancel" ]
486 | byte_(0x04) [ label::_val =
"cfp" ]
487 | byte_(0x05) [ label::_val =
"confirm" ]
488 | byte_(0x06) [ label::_val =
"disconfirm" ]
489 | byte_(0x07) [ label::_val =
"failure" ]
490 | byte_(0x08) [ label::_val =
"inform" ]
491 | byte_(0x09) [ label::_val =
"inform-if" ]
492 | byte_(0x0a) [ label::_val =
"inform-ref" ]
493 | byte_(0x0b) [ label::_val =
"not-understood" ]
494 | byte_(0x0c) [ label::_val =
"propagate" ]
495 | byte_(0x0d) [ label::_val =
"propose" ]
496 | byte_(0x0e) [ label::_val =
"proxy" ]
497 | byte_(0x0f) [ label::_val =
"query-if" ]
498 | byte_(0x10) [ label::_val =
"query-ref" ]
499 | byte_(0x11) [ label::_val =
"refuse" ]
500 | byte_(0x12) [ label::_val =
"reject-proposal" ]
501 | byte_(0x13) [ label::_val =
"request" ]
502 | byte_(0x14) [ label::_val =
"request-when" ]
503 | byte_(0x15) [ label::_val =
"request-whenever" ]
504 | byte_(0x16) [ label::_val =
"subscribe" ]
508 predefinedMessageParameter = byte_(0x02) [ phoenix::at_c<0>(label::_val) =
"sender" ] >> agentIdentifier [ phoenix::at_c<1>(label::_val) = label::_1 ]
509 | byte_(0x03) [ phoenix::at_c<0>(label::_val) =
"receiver" ] >> recipientExpr [ phoenix::at_c<1>(label::_val) = label::_1 ]
510 | byte_(0x04) [ phoenix::at_c<0>(label::_val) =
"content" ] >> msgContent [ phoenix::at_c<1>(label::_val) = label::_1 ]
511 | byte_(0x05) [ phoenix::at_c<0>(label::_val) =
"reply-with" ] >> replyWithParam [ phoenix::at_c<1>(label::_val) = label::_1 ]
512 | byte_(0x06) [ phoenix::at_c<0>(label::_val) =
"reply-by" ] >> replyByParam [ phoenix::at_c<1>(label::_val) = label::_1 ]
513 | byte_(0x07) [ phoenix::at_c<0>(label::_val) =
"in-reply-to" ] >> inReplyToParam [ phoenix::at_c<1>(label::_val) = label::_1 ]
514 | byte_(0x08) [ phoenix::at_c<0>(label::_val) =
"reply-to" ] >> replyToParam [ phoenix::at_c<1>(label::_val) = label::_1 ]
515 | byte_(0x09) [ phoenix::at_c<0>(label::_val) =
"language" ] >> language [ phoenix::at_c<1>(label::_val) = label::_1 ]
516 | byte_(0x0a) [ phoenix::at_c<0>(label::_val) =
"encoding" ] >> encoding [ phoenix::at_c<1>(label::_val) = label::_1 ]
517 | byte_(0x0b) [ phoenix::at_c<0>(label::_val) =
"ontology" ] >> ontology [ phoenix::at_c<1>(label::_val) = label::_1 ]
518 | byte_(0x0c) [ phoenix::at_c<0>(label::_val) =
"protocol" ] >> protocol [ phoenix::at_c<1>(label::_val) = label::_1 ]
519 | byte_(0x0d) [ phoenix::at_c<0>(label::_val) =
"conversation-id" ] >> conversationId [ phoenix::at_c<1>(label::_val) = label::_1 ]
522 recipientExpr = *agentIdentifier [ phoenix::push_back(label::_val, label::_1) ]
525 replyToParam = recipientExpr.alias();
531 #ifdef BOOST_SPIRIT_DEBUG 533 BOOST_SPIRIT_DEBUG_NODE(header);
534 BOOST_SPIRIT_DEBUG_NODE(messageId);
535 BOOST_SPIRIT_DEBUG_NODE(version);
536 BOOST_SPIRIT_DEBUG_NODE(messageType);
537 BOOST_SPIRIT_DEBUG_NODE(userDefinedMessageType);
538 BOOST_SPIRIT_DEBUG_NODE(messageParameter);
539 BOOST_SPIRIT_DEBUG_NODE(userDefinedMessageParameter);
540 BOOST_SPIRIT_DEBUG_NODE(predefinedMessageParameter);
541 BOOST_SPIRIT_DEBUG_NODE(predefinedMessageType);
563 qi::rule<Iterator, fipa::acl::Message()> aclCommunicativeAct;
564 qi::rule<Iterator> message;
565 qi::rule<Iterator, fipa::acl::Header()> header;
566 qi::rule<Iterator, char()> messageId;
567 qi::rule<Iterator, char()> version;
568 qi::rule<Iterator> endOfMessage;
569 qi::rule<Iterator> endOfCollection;
571 qi::rule<Iterator, std::string() > messageType;
572 qi::rule<Iterator, std::string() > userDefinedMessageType;
573 BinWord<Iterator> messageTypeName;
575 qi::rule<Iterator, fipa::acl::message::Parameter() > messageParameter;
576 qi::rule<Iterator, fipa::acl::message::Parameter() > userDefinedMessageParameter;
577 qi::rule<Iterator, fipa::acl::message::Parameter() > predefinedMessageParameter;
579 BinWord<Iterator> parameterName;
580 BinExpression<Iterator> parameterValue;
582 qi::rule<Iterator, std::string() > predefinedMessageType;
583 UserdefinedParameter<Iterator> userDefinedParameter;
585 qi::rule<Iterator, std::vector<fipa::acl::AgentIdentifier>() > recipientExpr;
587 AgentIdentifier<Iterator> agentIdentifier;
589 BinExpression<Iterator> binExpression;
590 BinWord<Iterator> binWord;
591 BinString<Iterator> binString;
592 BinString<Iterator> msgContent;
594 BinExpression<Iterator> replyWithParam;
595 BinDateTime<Iterator> replyByParam;
596 BinExpression<Iterator> inReplyToParam;
597 qi::rule<Iterator, std::vector<fipa::acl::AgentIdentifier>() > replyToParam;
598 BinExpression<Iterator> language;
599 BinExpression<Iterator> encoding;
600 BinExpression<Iterator> ontology;
601 BinWord<Iterator> protocol;
602 BinExpression<Iterator> conversationId;
609 #endif // _FIPAACL_GRAMMAR_BITEFFICIENT_H_ phoenix::function< convertToCharVectorImpl > convertToCharVector
boost::variant< std::string, fipa::acl::AgentIdentifier, std::vector< fipa::acl::AgentIdentifier >, fipa::acl::ByteSequence, fipa::acl::DateTime, fipa::acl::ByteString > ParameterValue
phoenix::function< convertToStringImpl > convertToString
boost::variant< std::string, fipa::acl::Resolver, std::vector< fipa::acl::Resolver >, fipa::acl::ByteSequence, fipa::acl::ByteString > UserDefinedParameterValue
BOOST_FUSION_ADAPT_STRUCT(fipa::acl::envelope::Parameter,(std::string, name)(fipa::acl::envelope::ParameterValue, data))
Definition for AgentIdentifier.
phoenix::function< convertDigitsToHexImpl > convertDigitsToHex
#define FIPA_DEBUG_RULE(X)
Foundation of Physical Intelligent Agents.
phoenix::function< extractFromCodetableImpl > extractFromCodetable