RoboBrain Interchange Language

Материал из roboforum.ru Wiki
Версия от 05:07, 23 октября 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 сообщения) не имеет кодов, добавленных в кодовую таблицу.