Rudimentary support for parsing definitive identifiers on modules.
authorKim Grasman <kim.grasman@gmail.com>
Sun, 25 Aug 2013 12:48:51 +0000 (14:48 +0200)
committerKim Grasman <kim.grasman@gmail.com>
Sun, 25 Aug 2013 12:48:51 +0000 (14:48 +0200)
asn1ate/parser.py
asn1ate/sema.py
testdata/definitive_identifier.asn [new file with mode: 0644]

index d36a340..fd13169 100644 (file)
@@ -190,6 +190,13 @@ def _build_asn1_grammar():
 
     value = builtin_value | defined_value | object_identifier_value
 
+    # definitive identifier value
+    definitive_number_form = Unique(number)
+    definitive_name_and_number_form = name_form + Suppress('(') + definitive_number_form + Suppress(')')
+    definitive_objid_component = definitive_name_and_number_form | name_form | definitive_number_form
+    definitive_objid_component_list = OneOrMore(definitive_objid_component)
+    definitive_identifier = Optional(Suppress('{') + definitive_objid_component_list + Suppress('}'))
+
     # tags
     class_ = UNIVERSAL | APPLICATION | PRIVATE
     class_number = Unique(number) # todo: consider defined values from 30.1
@@ -275,7 +282,8 @@ def _build_asn1_grammar():
 
     module_body = (assignment_list | empty)
     module_defaults = Suppress(tag_default + extension_default)  # we don't want these in the AST
-    module_definition = module_reference + DEFINITIONS + module_defaults + '::=' + BEGIN + module_body + END
+    module_identifier = module_reference + definitive_identifier
+    module_definition = module_identifier + DEFINITIONS + module_defaults + '::=' + BEGIN + module_body + END
 
     module_definition.ignore(comment)
 
@@ -315,6 +323,9 @@ def _build_asn1_grammar():
     number_form.setParseAction(annotate('NumberForm'))
     name_and_number_form.setParseAction(annotate('NameAndNumberForm'))
     object_identifier_value.setParseAction(annotate('ObjectIdentifierValue'))
+    definitive_identifier.setParseAction(annotate('DefinitiveIdentifier'))
+    definitive_number_form.setParseAction(annotate('DefinitiveNumberForm'))
+    definitive_name_and_number_form.setParseAction(annotate('DefinitiveNameAndNumberForm'))
 
     return module_definition
 
index b7eda08..f4a3f60 100644 (file)
@@ -120,12 +120,21 @@ Typically, if you have a ``reference_name``, you must also have a ``references``
 but not the other way around.
 """
 
+class SemaNode(object):
+    def children(self):
+        raise NotImplementedError()
+
+
 class Module(object):
     def __init__(self, elements):
-        module_reference, _, _, _, module_body, _ = elements
+        print(elements)
+        module_reference, definitive_identifier, _, _, _, module_body, _ = elements
         _assert_annotated_token(module_reference)
         _assert_annotated_token(module_body)
 
+        # Ignore the definitive identifier for now,
+        # maybe expose it from the Module if it comes to any use.
+
         self.name = module_reference.elements[0]
         self.assignments = [_create_sema_node(token) for token in module_body.elements]
         self._user_types = {}
diff --git a/testdata/definitive_identifier.asn b/testdata/definitive_identifier.asn
new file mode 100644 (file)
index 0000000..a1b466d
--- /dev/null
@@ -0,0 +1,5 @@
+-- Make sure we have name form, name and number form as well as simple number form
+TEST { iso member-body(2) us(840) 12345 }
+DEFINITIONS ::=
+BEGIN
+END