Support BIT STRING types without enumerators.
authorKim Grasman <kim.grasman@gmail.com>
Sat, 26 Jul 2014 08:50:26 +0000 (10:50 +0200)
committerKim Grasman <kim.grasman@gmail.com>
Sat, 26 Jul 2014 08:50:26 +0000 (10:50 +0200)
Found the lovely Optional(..., default=) construct.

asn1ate/parser.py
asn1ate/sema.py
testdata/builtin_types.asn
testdata/size_constraint.asn

index dac318b..09a3954 100644 (file)
@@ -261,7 +261,7 @@ def _build_asn1_grammar():
     setof_type = Suppress(SET) + Optional(size_constraint) + Suppress(OF) + (type_ | named_type)
     choice_type = CHOICE + braced_list(named_type | extension_marker)
     enumerated_type = ENUMERATED + braced_list(enumeration | extension_marker)
-    bitstring_type = BIT_STRING + braced_list(named_number) + Optional(single_value_constraint | size_constraint)
+    bitstring_type = BIT_STRING + Optional(braced_list(named_number), default=[]) + Optional(single_value_constraint | size_constraint, default=None)
     plain_integer_type = INTEGER + Optional(single_value_constraint)
     restricted_integer_type = INTEGER + braced_list(named_number) + Optional(single_value_constraint)
     boolean_type = BOOLEAN
index 98a2941..5900249 100644 (file)
@@ -595,6 +595,7 @@ class ValueListType(SemaNode):
     def __str__(self):
         named_value_list = ''
         constraint = ''
+
         if self.named_values:
             named_value_list = ' { %s }' % ', '.join(map(str, self.named_values))
 
@@ -609,17 +610,21 @@ class ValueListType(SemaNode):
 class BitStringType(SemaNode):
     def __init__(self, elements):
         self.type_name = elements[0]
-        if len(elements) > 1:
-            self.named_bits = [_create_sema_node(token) for token in elements[1]]
-        else:
-            self.named_bits = None
+        self.named_bits = [_create_sema_node(token) for token in elements[1]]
+        if elements[2]:
+            self.constraint = _create_sema_node(elements[2])
 
     def __str__(self):
+        named_bit_list = ''
+        constraint = ''
+
         if self.named_bits:
-            named_bit_list = ', '.join(map(str, self.named_bits))
-            return '%s { %s }' % (self.type_name, named_bit_list)
-        else:
-            return '%s' % self.type_name
+            named_bit_list = ' { %s }' % ', '.join(map(str, self.named_bits))
+
+        if self.constraint:
+            constraint = ' %s' % self.constraint
+
+        return '%s%s%s' % (self.type_name, named_bit_list, constraint)
 
     __repr__ = __str__
 
index b5b5a51..4c6f56c 100644 (file)
@@ -5,6 +5,7 @@ BEGIN
   Null ::= NULL
   Int ::= INTEGER
   Real ::= REAL
+  BitString0 ::= BIT STRING
 
   RestrictedInteger ::= INTEGER {
     v1(1),
index 7e4c84d..3f166c6 100644 (file)
@@ -9,6 +9,7 @@ BEGIN
   ConstrainedOctetStr3 ::= OCTET STRING (SIZE(min..max))\r
 \r
   ConstrainedBitString1 ::= BIT STRING { one(1), two(2) } (SIZE(6))\r
+  ConstrainedBitString2 ::= BIT STRING (SIZE(6))\r
 \r
   -- TypeWithConstraint syntax for SET OF and SEQUENCE OF\r
   SizedSetOf ::= SET SIZE(1..100) OF INTEGER\r