+ """import : IMPORT STRING_LITERAL ';'"""
+ p[0] = Import(p[2], revision=self.revision)
+
+ def p_path_elements(self, p):
+ """path_elements : path_element
+ | path_elements path_element"""
+ if len(p) == 2:
+ p[0] = p[1]
+ else:
+ if type(p[1]) is dict:
+ p[0] = [p[1], p[2]]
+ else:
+ p[0] = p[1] + [p[2]]
+
+ def p_path_element(self, p):
+ """path_element : STRING_LITERAL STRING_LITERAL ';'"""
+ p[0] = {"path": p[1], "counter": p[2]}
+
+ def p_paths(self, p):
+ """paths : PATHS '{' path_elements '}' ';'"""
+ p[0] = Paths(p[3])
+
+ def p_counters(self, p):
+ """counters : COUNTERS ID '{' counter_elements '}' ';'"""
+ p[0] = Counter(p[2], p[4])
+
+ def p_counter_elements(self, p):
+ """counter_elements : counter_element
+ | counter_elements counter_element"""
+ if len(p) == 2:
+ p[0] = [p[1]]
+ else:
+ if type(p[1]) is dict:
+ p[0] = [p[1], p[2]]
+ else:
+ p[0] = p[1] + [p[2]]
+
+ def p_counter_element(self, p):
+ """counter_element : ID '{' counter_statements '}' ';'"""
+ p[0] = {**{"name": p[1]}, **p[3]}
+
+ def p_counter_statements(self, p):
+ """counter_statements : counter_statement
+ | counter_statements counter_statement"""
+ if len(p) == 2:
+ p[0] = p[1]
+ else:
+ p[0] = {**p[1], **p[2]}
+
+ def p_counter_statement(self, p):
+ """counter_statement : SEVERITY ID ';'
+ | UNITS STRING_LITERAL ';'
+ | DESCRIPTION STRING_LITERAL ';'
+ | TYPE ID ';'"""
+ p[0] = {p[1]: p[2]}