Parse and ignore external value references.
authorKim Grasman <kim.grasman@gmail.com>
Fri, 25 Jul 2014 09:40:04 +0000 (11:40 +0200)
committerKim Grasman <kim.grasman@gmail.com>
Fri, 25 Jul 2014 09:40:04 +0000 (11:40 +0200)
asn1ate/parser.py
asn1ate/sema.py
testdata/external_valueref.asn [new file with mode: 0644]

index 917a3d5..f9ef0be 100644 (file)
@@ -186,8 +186,9 @@ def _build_asn1_grammar():
     cstring_value = dblQuotedString
 
     builtin_value = boolean_value | bitstring_value | real_value | integer_value | null_value | cstring_value
-    defined_value = Unique(valuereference) # todo: more options from 13.1
-    referenced_value = Unique(defined_value) # todo: more options from 16.11
+    external_value_reference = module_reference + Suppress('.') + valuereference
+    defined_value = external_value_reference | valuereference  # todo: more options from 13.1
+    referenced_value = Unique(defined_value)  # todo: more options from 16.11
 
     # object identifier value
     name_form = Unique(identifier)
index 11df19d..e9999e7 100644 (file)
@@ -460,7 +460,14 @@ class ReferencedType(SemaNode):
 
 class ReferencedValue(SemaNode):
     def __init__(self, elements):
-        self.name = elements[0]
+        # TODO: Module references are not resolved at the moment,
+        # and I'm not sure how to handle them.
+        if len(elements) > 1 and elements[0].ty == 'ModuleReference':
+            self.module_reference = elements[0].elements[0]
+            self.name = elements[1]
+        else:
+            self.module_reference = None
+            self.name = elements[0]
 
     def reference_name(self):
         return self.name
diff --git a/testdata/external_valueref.asn b/testdata/external_valueref.asn
new file mode 100644 (file)
index 0000000..bd0404f
--- /dev/null
@@ -0,0 +1,7 @@
+M1 DEFINITIONS ::=\r
+BEGIN\r
+  v1 INTEGER ::= 100\r
+  v2 INTEGER ::= v1\r
+\r
+  v3 INTEGER ::= M1.v1\r
+END\r