aboutsummaryrefslogtreecommitdiffstats
path: root/osmo_codegen.g
diff options
context:
space:
mode:
Diffstat (limited to 'osmo_codegen.g')
-rw-r--r--osmo_codegen.g65
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') ;