39 lines
1.0 KiB
ANTLR
39 lines
1.0 KiB
ANTLR
|
|
grammar bprotoV1;
|
|
|
|
protocol_defintion : protocol_header (message_def | enum_def | bit_field_def)+;
|
|
|
|
protocol_header : 'protocol' IDENTIFIER 'version' INT ;
|
|
|
|
// Protocol definitions
|
|
message_def : 'message' message_id IDENTIFIER '{' (field ',')* (field ','?)? '}' ;
|
|
message_id : '[' INT ']';
|
|
enum_def : 'enum' IDENTIFIER enum_body;
|
|
bit_field_def : 'bits' IDENTIFIER bitfield_body;
|
|
|
|
field : field_pos IDENTIFIER ':' dtype;
|
|
field_pos : '[' INT ']';
|
|
|
|
dtype: type_standard | type_enum | type_bitfield;
|
|
|
|
type_standard : IDENTIFIER array_extension?;
|
|
type_enum : 'enum' (enum_body | IDENTIFIER);
|
|
type_bitfield : 'bits' (bitfield_body | IDENTIFIER);
|
|
|
|
array_extension: '[' INT ']';
|
|
|
|
// enum def
|
|
enum_body : '{' (enum_field ',')* (enum_field ','?)? '}';
|
|
enum_field: IDENTIFIER ('=' INT)? ;
|
|
|
|
// bit field def
|
|
bitfield_body : '{' (bitfield_field ',')* (bitfield_field ','?)? '}';
|
|
bitfield_field: IDENTIFIER (':' INT)?;
|
|
|
|
// Lexer rules
|
|
INT : [0-9]+;
|
|
IDENTIFIER : [a-zA-Z0-9_]+;
|
|
|
|
WS : [ \t\r\n]+ -> skip;
|
|
COMMENT : '//' ~[\r\n]* -> skip;
|
|
COMMENT_MULTILINE : '/*' .*? '*/' -> skip; |