1 #ifndef _FIPAACL_GRAMMAR_BITEFFICIENT_H_
2 #define _FIPAACL_GRAMMAR_BITEFFICIENT_H_
4 #include <fipa_acl/message_parser/grammar/grammar_common.h>
6 using namespace fipa::acl::grammar;
21 fipa::acl::message::Parameter,
27 fipa::acl::UserDefinedParameter,
35 (std::vector<std::
string>, addresses)
36 (std::vector<fipa::acl::
Resolver>, resolvers)
37 (std::vector<fipa::acl::UserDefinedParameter>, parameters)
43 (fipa::acl::Header, header)
45 (std::vector<fipa::acl::message::Parameter>, parameters)
58 namespace bitefficient {
61 namespace label = qi::labels;
63 template<
typename Iterator>
68 eof_collection_rule = qi::byte_(0x01);
76 template<
typename Iterator>
77 struct BinStringNoCodetable : qi::grammar<Iterator, fipa::acl::ByteSequence(), qi::locals<boost::uint_least32_t> >
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 ] )
102 qi::rule<Iterator, std::vector<unsigned char>(boost::uint_least32_t) > byteSeq;
106 template<
typename Iterator>
107 struct BinStringCodetable : qi::grammar<Iterator, fipa::acl::ByteSequence(), qi::locals<boost::uint_least32_t> >
113 bin_string_codetable_rule =
127 template<
typename Iterator>
128 struct BinString : qi::grammar<Iterator, fipa::acl::ByteSequence() >
132 bin_string_rule = ( binStringNoCodetable | binStringCodetable) [ label::_val = label::_1];
143 template<
typename Iterator>
152 bin_number_rule = ( byte_(0x12) >> digits [ label::_val = label::_1 ] )
163 template <
typename Iterator>
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);
221 template <
typename Iterator>
222 struct BinWord : qi::grammar<Iterator, std::string()>
228 bin_word_rule = ( ( byte_(0x10)
229 >> word [ label::_val = label::_1 ]
242 template <
typename Iterator>
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);
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;
353 qi::rule<Iterator, fipa::acl::ByteSequence(boost::uint32_t) >
fipaString;
362 template<
typename Iterator>
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 ];
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);
410 qi::rule<Iterator, std::vector<std::string>() > addresses;
411 qi::rule<Iterator, std::vector<fipa::acl::Resolver>() > resolvers;
413 qi::rule<Iterator, std::vector<std::string>() > urlCollection;
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);
565 qi::rule<Iterator, fipa::acl::Header()>
header;
585 qi::rule<Iterator, std::vector<fipa::acl::AgentIdentifier>() > recipientExpr;
597 qi::rule<Iterator, std::vector<fipa::acl::AgentIdentifier>() > replyToParam;
609 #endif // _FIPAACL_GRAMMAR_BITEFFICIENT_H_
BinExpression< Iterator > encoding
CodedNumber< Iterator > codedNumber
BinExpression< Iterator > ontology
qi::rule< Iterator, std::string(), qi::locals< boost::uint_least32_t > > exprEnd
BinString< Iterator > msgContent
qi::rule< Iterator, fipa::acl::Message()> aclCommunicativeAct
qi::rule< Iterator > endOfCollection
phoenix::function< convertToCharVectorImpl > convertToCharVector
BinExpression< Iterator > binExpression
boost::recursive_wrapper< AgentIdentifier > Resolver
qi::rule< Iterator, std::string() > binExpr
qi::rule< Iterator, fipa::acl::message::Parameter() > messageParameter
BinExpression< Iterator > replyWithParam
qi::rule< Iterator, std::string()> bin_number_rule
qi::rule< Iterator, char() > typeDesignator
qi::rule< Iterator, std::string() > messageType
BinExpression< Iterator > binExpression
Digits< Iterator > digits
qi::rule< Iterator, std::string()> bin_word_rule
boost::variant< std::string, fipa::acl::AgentIdentifier, std::vector< fipa::acl::AgentIdentifier >, fipa::acl::ByteSequence, fipa::acl::DateTime, fipa::acl::ByteString > ParameterValue
qi::rule< Iterator, std::string(), qi::locals< boost::uint_least32_t > > exprStart
qi::rule< Iterator, fipa::acl::ByteSequence() > stringLiteralTerminated
qi::rule< Iterator, fipa::acl::DateTime() > bin_date_time_rule
qi::rule< Iterator, fipa::acl::AgentIdentifier()> agent_identifier_rule
qi::rule< Iterator, qi::unused_type > eof_collection_rule
BinWord< Iterator > protocol
qi::rule< Iterator, char()> version
BinWord< Iterator > messageTypeName
phoenix::function< convertToStringImpl > convertToString
BinWord< Iterator > agentName
qi::rule< Iterator, fipa::acl::UserDefinedParameter() > userdefined_parameter_rule
qi::rule< Iterator > message
BinWord< Iterator > parameterName
qi::rule< Iterator, fipa::acl::message::Parameter() > predefinedMessageParameter
qi::rule< Iterator, fipa::acl::ByteSequence(boost::uint32_t) > fipaString
NullTerminatedString< Iterator > nullTerminatedString
qi::rule< Iterator, std::string() > userDefinedMessageType
boost::variant< std::string, fipa::acl::Resolver, std::vector< fipa::acl::Resolver >, fipa::acl::ByteSequence, fipa::acl::ByteString > UserDefinedParameterValue
AgentIdentifier< Iterator > agentIdentifier
StringLiteral< Iterator > stringLiteral
ByteLengthEncodedStringTerminated< Iterator > byteLengthEncodedStringTerminated
UserdefinedParameter< Iterator > userDefinedParameter
BOOST_FUSION_ADAPT_STRUCT(fipa::acl::envelope::Parameter,(std::string, name)(fipa::acl::envelope::ParameterValue, data))
BinStringCodetable< Iterator > binStringCodetable
BinDateTime< Iterator > replyByParam
qi::rule< Iterator, fipa::acl::ByteSequence(), qi::locals< boost::uint_least32_t > > bin_string_codetable_rule
BinString< Iterator > binString
BinWord< Iterator > binWord
BinExpression< Iterator > parameterValue
phoenix::function< convertDigitsToHexImpl > convertDigitsToHex
BinWord< Iterator > binWord
qi::rule< Iterator > endOfMessage
BinExpression< Iterator > language
qi::rule< Iterator, fipa::acl::ByteSequence(boost::uint32_t) > byteLengthEncodedString
qi::rule< Iterator, fipa::acl::ByteSequence(), qi::locals< boost::uint_least32_t > > bin_string_no_codetable_rule
qi::rule< Iterator > endOfCollection
qi::rule< Iterator, std::string() > predefinedMessageType
grammar::DateTime< Iterator > binDate
BinExpression< Iterator > conversationId
#define FIPA_DEBUG_RULE(X)
BinString< Iterator > binString
qi::rule< Iterator, char()> messageId
qi::rule< Iterator, fipa::acl::ByteSequence()> bin_string_rule
BinExpression< Iterator > inReplyToParam
BinDateTime< Iterator > binDateTime
qi::rule< Iterator, fipa::acl::message::Parameter() > userDefinedMessageParameter
BinWord< Iterator > binWord
UserdefinedParameter< Iterator > userDefinedParameter
BinNumber< Iterator > binNumber
phoenix::function< extractFromCodetableImpl > extractFromCodetable
Digits< Iterator > digits
qi::rule< Iterator, std::string() > byteLengthEncodedStringHeader
BinStringNoCodetable< Iterator > binStringNoCodetable
qi::rule< Iterator, fipa::acl::Header()> header
qi::rule< Iterator, std::string()> bin_expression_rule