From 6a6c1b118901d32217282dd6c4ca8f31973ffe31 Mon Sep 17 00:00:00 2001 From: Sven Gestegard Robertz <sven.robertz@cs.lth.se> Date: Sat, 10 Jan 2015 14:40:03 +0100 Subject: [PATCH] updated grammar appendix --- doc/tech_report.tex | 97 +++++++++++++++++++++++++++------------------ 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/doc/tech_report.tex b/doc/tech_report.tex index 5bc57db..b482231 100644 --- a/doc/tech_report.tex +++ b/doc/tech_report.tex @@ -289,6 +289,7 @@ With the following `example.lc` file: and this \verb+example_encoder.c+ file \lstinputlisting[basicstyle=\footnotesize,language=C]{../examples/wiki_example/example_encoder.c} +\newpage Running \verb+./example_encoder one two+, will yield the following result in example.encoded: \begin{verbatim} @@ -306,7 +307,9 @@ Running \verb+./example_encoder one two+, will yield the following result in exa i.e., \begin{verbatim} <version> <length: 12> <string: <len: 11> <"LabComm2014">> -<sample_decl> <length: 48 <user_id: 0x40> <string: <len: 11> <"log_message"> +<sample_decl> <length: 48 + <user_id: 0x40> + <string: <len: 11> <"log_message"> <signature_length: 34> <struct_decl: <number_of_fields: 2> @@ -379,37 +382,25 @@ VariableSize : Exp; \section{The LabComm protocol} \label{sec:ProtocolGrammar} +Each LabComm2014 packet has the layout +\begin{verbatim} +<id> <length> <data...> +\end{verbatim} +where \verb+length+ is the number of bytes of the \verb+data+ part +(i.e., excluding the \verb+id+ and \verb+length+ fields), and +the \verb+id+ gives the layout of the \verb+data+ part as defined +in \ref{sec:ConcreteGrammar} +\subsection{Data encoding} +LabComm primitive types are encoded as fixed width values, sent in +network order. Type fields, user IDs, number of indices and lengths are +sent in a variable length (\emph{varint}) form. A varint integer value +is sent as a sequence of bytes where the lower seven bits contain a +chunk of the actual number and the high bit indicates if more chunks +follow. The sequence of chunks are sent with the least significant chunk +first. + +The built-in data types are encoded as follows: \begin{verbatim} -<packet> := ( <type_decl> | <sample_decl> | <sample_data> )* -<type_decl> := 0x01 ''(packed)'' <user_id> <string> <type> -<sample_decl> := 0x02 ''(packed)''<user_id> <string> <type> -<user_id> := 0x40..0xffffffff ''(packed)'' -<string> := <string_length> <char>* -<string_length> := 0x00..0xffffffff ''(packed)'' -<char> := any UTF-8 char -<type> := ( <basic_type> | <user_id> | <array_decl> | <struct_decl> ) -<basic_type> := ( <boolean_type> | <byte_type> | <short_type> | - <integer_type> | <long_type> | <float_type> | - <double_type> | <string_type> ) -<boolean_type> := 0x20 ''(packed)'' -<byte_type> := 0x21 ''(packed)'' -<short_type> := 0x22 ''(packed)'' -<integer_type> := 0x23 ''(packed)'' -<long_type> := 0x24 ''(packed)'' -<float_type> := 0x25 ''(packed)'' -<double_type> := 0x26 ''(packed)'' -<string_type> := 0x27 ''(packed)'' -<array_decl> := 0x10 ''(packed)'' <number_of_indices> <indices> <type> -<number_of_indices> := 0x00..0xffffffff ''(packed)'' -<indices> := ( <variable_index> | <fixed_index> )* -<variable_index> := 0x00 ''(packed)'' -<fixed_index> := 0x01..0xffffffff ''(packed)'' -<struct_decl> := 0x11 ''(packed)'' <number_of_fields> <field>* -<number_of_fields> := 0x00..0xffffffff ''(packed)'' -<field> := <string> <type> -<sample_data> := <user_id> <packed_sample_data> -<packed_sample_data> := is sent in network order, sizes are as follows: - ||Type ||Encoding/Size || ||---------------||------------------------------------------------------|| ||boolean || 8 bits || @@ -419,18 +410,46 @@ VariableSize : Exp; ||long || 64 bits || ||float || 32 bits || ||double || 64 bits || -||string || length ''(packed)'', followed by UTF8 encoded string || -||array || each variable index ''(packed)'', || +||string || length (varint), followed by UTF8 encoded string || +||array || each variable index (varint), || || || followed by encoded elements || ||struct || concatenation of encoding of each element || || || in declaration order || \end{verbatim} -Type fields, user IDs, number of indices and lengths are sent in a packed, or -variable length, form. An integer is sent as a sequence of bytes where the -lower seven bits contain a chunk of the actual number and the high bit -indicates if more chunks follow. The sequence of chunks are sent with the least -significant chunk first. (The numbers encoded in this form are indicated above -with \textit{(packed)}.) +\subsection{Protocol grammar} +\label{sec:ConcreteGrammar} +\begin{verbatim} +<packet> := ( <version> | <type_decl> | <sample_decl> | <sample_data> )* +<version> := 0x01 <length> <string> +<sample_def> := 0x02 <length> <user_id> <string> <type> +<type_def> := 0x03 <length> <user_id> <string> <type> +<user_id> := 0x40..0xffffffff +<string> := <string_length> <char>* +<string_length> := 0x00..0xffffffff +<char> := any UTF-8 char +<type> := <length> ( <basic_type> | <user_id> | <array_decl> | <struct_decl> ) +<basic_type> := ( <boolean_type> | <byte_type> | <short_type> | + <integer_type> | <long_type> | <float_type> | + <double_type> | <string_type> ) +<boolean_type> := 0x20 +<byte_type> := 0x21 +<short_type> := 0x22 +<integer_type> := 0x23 +<long_type> := 0x24 +<float_type> := 0x25 +<double_type> := 0x26 +<string_type> := 0x27 +<array_decl> := 0x10 <number_of_indices> <indices> <type> +<number_of_indices> := 0x00..0xffffffff +<indices> := ( <variable_index> | <fixed_index> )* +<variable_index> := 0x00 +<fixed_index> := 0x01..0xffffffff +<struct_decl> := 0x11 <number_of_fields> <field>* +<number_of_fields> := 0x00..0xffffffff +<field> := <string> <type> +<sample_data> := <user_id> <packed_sample_data> +<packed_sample_data> := is sent in network order, encoded : +\end{verbatim} \end{document} -- GitLab