diff options
author | Harald Welte <laforge@gnumonks.org> | 2011-01-10 23:38:58 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2011-01-10 23:38:58 +0100 |
commit | 16e523d2d07e463da80d3e18e1117c4353dcad0c (patch) | |
tree | 2da1ccb43b34387996d4af97a945fe63f375c78c /osmo_codegen.g | |
parent | 181a12a4194252cb3371321372ae106adfca623f (diff) |
add IE definitions for most MM/CC IEs
Diffstat (limited to 'osmo_codegen.g')
-rw-r--r-- | osmo_codegen.g | 65 |
1 files changed, 48 insertions, 17 deletions
diff --git a/osmo_codegen.g b/osmo_codegen.g index c23d99c..7560400 100644 --- a/osmo_codegen.g +++ b/osmo_codegen.g @@ -4,16 +4,45 @@ grammar osmo_codegen; //language = Python; //} root : - pdu_spec* + (pdu_spec | ie_spec | ie_alias)* ; +ie_alias: 'ie_alias' ie_name ie_name; + +ie_name : ID; + +ie_spec : 'ie_spec' ID + ie_field_def* + 'end_ie_spec' + ; + +ie_field_def + : ie_field_name ie_field_len ie_field_type ie_field_opts + ; + +ie_field_name + : ID; +ie_field_len + : (NUMERIC | '*'); +ie_field_type + : ('byte' | 'bytes' | 'bit' | 'bits' | 'bcd'); +ie_field_opts + : field_val? ie_field_cond? ie_field_endian?; +ie_field_cond + : 'if (' ie_field_name COMP_OP NUMERIC ')'; +ie_field_endian + : ('big' | 'little'); + + +/* PDU */ + pdu_spec - : 'pdu_spec' ID - field_def* - 'end_pdu_spec' + : 'pdu_spec' ID + pdu_field_def* + 'end_pdu_spec' ; -field_mode +pdu_field_mode : 'mand' | 'opt' | 'cond'; field_val @@ -22,27 +51,27 @@ field_val field_tag : 'tag' NUMERIC; -field_size +pdu_field_size : NUMERIC ('-' NUMERIC)? ; -field_opts +pdu_field_opts : ('uplink_only' | 'downlink_only') ; -field_type +pdu_field_type : ( - ('V4u' field_val?) - | ('V4l' field_val?) - | ('V' field_size field_val?) - | ('TLV' field_size? field_val? field_tag) - | ('LV' field_size field_val?) - | ('TV' field_size field_val? field_tag) + ('V4u' field_val?) + | ('V4l' field_val?) + | ('V' pdu_field_size field_val?) + | ('TLV' pdu_field_size? field_val? field_tag) + | ('LV' pdu_field_size field_val?) + | ('TV' pdu_field_size field_val? field_tag) | ('T' field_val? field_tag) | ('TV4' field_val? field_tag) - ) field_opts*; + ) pdu_field_opts*; -field_def - : ID field_mode field_type; +pdu_field_def + : ID pdu_field_mode pdu_field_type; /* LEXER RULES */ @@ -72,6 +101,8 @@ STRING : '"' ( ESC_SEQ | ~('\\'|'"') )* '"' ; +COMP_OP : '==' | '<' | '>' | '>=' | '<=' | '!='; + fragment HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ; |