RoboBrain Interchange Language — различия между версиями
=DeaD= (обсуждение | вклад) (→Синтаксические EBNF правила) |
|||
| Строка 22: | Строка 22: | ||
| Звездочка обозначает ноль или большее количество повторений предшествующего ей выражения || Digit* | | Звездочка обозначает ноль или большее количество повторений предшествующего ей выражения || Digit* | ||
|- | |- | ||
| − | | Плюс обозначает одно или большее количество повторений предшествующего ему выражения || Digit | + | | Плюс обозначает одно или большее количество повторений предшествующего ему выражения || Digit+ |
|- | |- | ||
| Круглые скобки используются для расширения группы || ( A ! B )* | | Круглые скобки используются для расширения группы || ( A ! B )* | ||
Версия 07:00, 22 октября 2009
RBIL - открытый стандарт языка верхнего уровня, предназначенной для взаимодействия электронных модулей в роботехнике а также роботов между собой.
За основу взята рекомендация FIPA - язык ACL.
Синтаксические EBNF правила
| Компонент грамматического правила | Пример |
|---|---|
| Терминальные символы заключаются в двойные кавычки | "(" |
| Нетерминальные символы пишутся с большой буквы | Expression |
| Квадратные скобки ограничивают необязательные конструкции | [ "," OptionalArg ] |
| Вертикальный разделитель обозначает альтернативные варианты | Integer ! Float |
| Звездочка обозначает ноль или большее количество повторений предшествующего ей выражения | Digit* |
| Плюс обозначает одно или большее количество повторений предшествующего ему выражения | Digit+ |
| Круглые скобки используются для расширения группы | ( A ! B )* |
| Правило содержит в левой части нетерминальный символ, а в правой - выражение и заканчивается точкой | ANonTerminal = "terminal". |
| 0x?? - байт в шестнадцатеричном коде | 0x00 |
Синтаксис RBIL сообщения в EBNF форме в бинарной нотации
| Левая часть правила | Правая часть правила | Комментарий | |
|---|---|---|---|
| RBILCommunicativeAct | = | Message. | |
| Message | = | Header MessageType MessageParameter* EndofMsg. | |
| Header | = | MessageId Version. | |
| MessageId | = | 0xFA | |
| ! | 0xFB | ||
| ! | 0xFC. | См. комментарий 1 ниже | |
| Version | = | Byte. | См. комментарий 2 ниже |
| EndofMsg | = | EndOfCollection. | |
| EndOfCollection | = | 0x01. | |
| MessageType | = | PredefinedMsgType | |
| ! | UserDefinedMsgType. | См. комментарий 3 ниже | |
| UserDefinedMsgType | = | 0x00 MsgTypeName. | |
| MsgTypeName | = | BinWord. | |
| MessageParameter | = | PredefinedParam | |
| ! | UserDefinedMsgParam. | См. комментарий 4 ниже | |
| UserDefinedMsgParam | = | 0x00 ParameterName ParameterValue. | |
| ParameterName | = | BinWord. | |
| ParamterValue | = | BinExpression. | |
| PredefinedMsgType | = | 0x01 | accept-proposal |
| ! | 0x02 | agree | |
| ! | 0x03 | cancel | |
| ! | 0x04 | cfp | |
| ! | 0x05 | confirm | |
| ! | 0x06 | disconfirm | |
| ! | 0x07 | failure | |
| ! | 0x08 | inform | |
| ! | 0x09 | inform-if | |
| ! | 0x0a | inform-ref | |
| ! | 0x0b | not-understood | |
| ! | 0x0c | propagate | |
| ! | 0x0d | propose | |
| ! | 0x0e | proxy | |
| ! | 0x0f | query-if | |
| ! | 0x10 | query-ref | |
| ! | 0x11 | refuse | |
| ! | 0x12 | reject-proposal | |
| ! | 0x13 | request | |
| ! | 0x14 | request-when | |
| ! | 0x15 | request-whenever | |
| ! | 0x16. | subscribe | |
| PredefinedMsgParam | = | 0x02 AgentIdentifier | sender (Отправитель сообщения) |
| ! | 0x03 RecipientExpr | receiver (Получатель(и)сообщения) | |
| ! | 0x04 MsgContent | content (Содержание сообщения) | |
| ! | 0x05 ReplyWithParam | reply-with (Метка исходящего сообщения) | |
| ! | 0x06 ReplyByParam | reply-by (Лимит времени на ответ) | |
| ! | 0x07 InReplyToParam | in-reply-to (Ссылка на входящее сообщение) | |
| ! | 0x08 ReplyToParam | reply-to (Получатель ответа на это сообщение в случае, если это не sender) | |
| ! | 0x09 Language | language (Язык сообщения) | |
| ! | 0x0a Encoding | encoding | |
| ! | 0x0b Ontology | ontology (Онтология) | |
| ! | 0x0c Protocol | protocol (Используемый протокол общения) | |
| ! | 0x0d ConversationID. | conversation-id (Идентификатор разговора) | |
| AgentIdentifier | = | 0x02 AgentName | |
| [Addresses] | |||
| [Resolvers] | |||
| (UserDefinedParameter)* | |||
| EndOfCollection. | |||
| AgentName | = | BinWord. | |
| Addresses | = | 0x02 UrlCollection. | |
| Resolvers | = | 0x03 AgentIdentifierCollection. | |
| UserDefinedParameter | = | 0x04 BinWord BinExpression. | |
| UrlCollection | = | (Url)* EndofCollection. | |
| Url | = | BinWord. | |
| AgentIdentifierCollection | = | (AgentIdentifier)* EndOfCollection. | |
| RecipientExpr | = | AgentIdentifierCollection. | |
| MsgContent | = | BinString. | |
| ReplyWithParam | = | BinExpression. | |
| ReplyByParam | = | BinDateTimeToken. | |
| InReplyToParam | = | BinExpression. | |
| ReplyToParam | = | RecipientExpr. | |
| Language | = | BinExpression. | |
| Encoding | = | BinExpression. | |
| Ontology | = | BinExpression. | |
| Protocol | = | BinWord. | |
| ConversationID | = | BinExpression. | |
| BinWord | = | 0x10 Word 0x00 | |
| BinNumber | = | 0x12 Digits | Десятичное число |
| ! | 0x13 Digits. | Шестнадцатиричное число | |
| Digits | = | CodedNumber+. | |
| BinString | = | 0x14 String 0x00 | New string literal |
| ! | 0x15 Index | String literal from code table | |
| ! | 0x16 Len8 ByteSeq | New ByteLengthEncoded string | |
| ! | 0x17 Len16 ByteSeq | New ByteLengthEncoded string | |
| ! | 0x18 Index | ByteLengthEncoded from code table | |
| ! | 0x19 Len32 ByteSeq. | New ByteLengthEncoded string | |
| BinDateTimeToken | = | 0x20 BinDate | Абсолютное время |
| ! | 0x21 BinDate | Относительное время (+) | |
| ! | 0x22 BinDate | Относительное время (-) | |
| ! | 0x24 BinDate TypeDesignator | Абсолютное время | |
| ! | 0x25 BinDate TypeDesignator | Относительное время (+) | |
| ! | 0x26 BinDate TypeDesignator. | Относительное время (-) | |
| BinDate | = | Year Month Day Hour Minute Second 202 Millisecond. | См. комментарий 8 ниже |
| BinExpression | = | BinExpr | См. комментарий 9 ниже |
| ! | 0xFF BinString. | ||
| BinExpr | = | BinWord | |
| ! | BinString | ||
| ! | BinNumber | ||
| ! | ExprStart BinExpr* ExprEnd. | ||
| ExprStart | = | 0x60 | Level down (i.e. ‘(’ –character) |
| ! | 0x70 Word 0x00 | Level down, new word follows | |
| ! | 0x71 Index | Level down, word code follows | |
| ! | 0x72 Digits | Level down, number follows | |
| ! | 0x73 Digits | Level down, hex number follows | |
| ! | 0x74 String 0x00 | Level down, new string follows | |
| ! | 0x75 Index | Level down, string code follows | |
| ! | 0x76 Len8 String | Level down, new byte string (1 byte) | |
| ! | 0x77 Len16 String | Level down, new byte string (2 byte) | |
| ! | 0x78 Len32 String | Level down, new byte string (4 byte | |
| ! | 0x79 Index. | Level down, new byte string (4 byte) | |
| = | 0x79 Index. | Level down, byte string code follows | |
| ExprEnd | = | 0x40 | Level up (i.e. ‘)’ –character) |
| ! | 0x50 Word 0x00 | Level up, new word follows | |
| ! | 0x51 Index | Level up, word code follows | |
| ! | 0x52 Digits | Level up, number follows | |
| ! | 0x53 Digits | Level up, hexadecimal number follows | |
| ! | 0x54 String 0x00 | Level up, new string follows | |
| ! | 0x55 Index | Level up, string code follows | |
| ! | 0x56 Len8 String | Level up, new byte string (1 byte) | |
| ! | 0x57 Len16 String | Level up, new byte string (2 byte) | |
| ! | 0x58 Len32 String | Level up, new byte string (4 byte) | |
| ! | 0x59 Index. | Level up, byte string code follows | |
| ByteSeq | = | Byte*. | |
| Index | = | Byte | |
| ! | Short. | См. комментарий 6 ниже | |
| Len8 | = | Byte. | См. комментарий 7 ниже |
| Len16 | = | Short. | См. комментарий 7 ниже |
| Len32 | = | Long. | См. комментарий 7 ниже |
| Year | = | Byte Byte. | |
| Month | = | Byte. | |
| Day | = | Byte. | |
| Hour | = | Byte. | |
| Minute | = | Byte. | |
| Second | = | Byte. | |
| Millisecond | = | Byte Byte. | |
| Word | = | as in [FIPA00070] | |
| String | = | as in [FIPA00070] | |
| CodedNumber | = | См. комментарий 5 ниже | |
| TypeDesignator | = | as in [FIPA00070] |
Комментарии к грамматическим правилам RBIL сообщения
- 1. Первый байт определяет идентификатор сообщения. Байт идентификатора может использоваться для того, чтобы разделять бинарную нотацию RBIL сообщения от (например) текстовой нотации сообщений и отделять различные схемы кодирования. Идентификатор сообщения 0xFA определяет бинарную нотацию без динамических таблиц, а идентификатор сообщения 0xFB определяет бинарную нотацию с динамическими таблицами. Идентификатор сообщения 0xFC используется, когда динамические таблицы используются, но отправитель не хочет обновить динамические таблицы (даже если сообщение содержит строки, которые должны быть добавлены в кодовую таблицу).
- 2. Второй байт определяет номер версии. Байт номера версии содержит основной номер версии в верхних четырех битах, а минорный номер - в младших четырех битах. Эта спецификация определяет версию 1.0 (закодированную как 0x10).
- 3. Все типы сообщения, определенные в этой спецификации имеют предопределенный код. Если кодирующее устройство посылает RBIL сообщение с типом сообщения, который не имеет никакого предопределенного кода, нужно использовать механизм расширения, который добавляет новый тип сообщения в кодовую таблицу (если кодовые таблицы используются).
- 4. Все параметры сообщения, определенные в этой спецификации имеют предопределенный код. Если сообщение содержит определенный пользователем параметр сообщения, то используется механизм расширения (байт 0x00) и новый код добавляется в кодовую таблицу (если кодовая таблица используется).
- 5. Цифры закодированы в четырех битах ASCII - кодировки, то есть две цифры ASCII могут быть закодированы в один байт. Таблица 1 показывает 4 - битные коды для каждой цифры и специальные коды, которые могут появляться в ASCII кодировке чисел.
Если ASCII - представление числа содержит нечетное количество цифр, последние четыре бита закодированного числа устанавливаются в ноль (символ Padding), иначе дополнительный 0x00 байт будет добавлен к концу закодированного числа. Если число, которое будет закодировано - целое число, десятичное число, или восьмеричное число, используется байт 0x12 идентификатора. Для шестнадцатиричных чисел используется байт 0x13 идентификатора. Шестнадцатиричные числа перед кодированием конвертируются в целые числа (схема кодирования не позволяет символам больше f появляться в числе).
| Символ | Код | Символ | Код |
|---|---|---|---|
| Padding | 0000 | 7 | 1000 |
| 0 | 0001 | 8 | 1001 |
| 1 | 0010 | 9 | 1010 |
| 2 | 0011 | + | 1100 |
| 3 | 0100 | E | 1101 |
| 4 | 0101 | - | 1110 |
| 5 | 0110 | . | 1111 |
| 6 | 0111 |
- 6. Индекс - это указатель на вход в кодовую таблицу, и его размер (битах) зависит от размера кодовой таблицы. Если размер кодовой таблицы - 256, размер индекса - один байт; иначе его размер - два байта (представленный в сетевом порядке байт).
- 7. Byte - однобайтовое кодовое слово, Short - короткое целое число (два байта, в сетевом порядке байт), Long - длинное целое число (четыре байта, в сетевом порядке байт).
- 8. Данные закодированы как числа, то есть четыре бита для каждоцифры ASCII (см. комментарий 5 выше). Информация, присутствует ли тип designator или нет, закодирована в байте идентификатора. Эти поля всегда имеют статическую длину (два байта в представлении года и миллисекунд, один байт для других компонентов).
- 9. Ничто из фактического содержания сообщения (информация, содержащаяся в параметре Content RBCL сообщения) не имеет кодов, добавленных в кодовую таблицу.