1 ''' @file apg_py/api/rule_dependencies.py
2 @brief Determine which rules each rule depends on and vice versa.'''
4 from pprint
import pprint
8 '''Determine the rule dependencies and
9 recursive types for each rule.
10 @param rules The rules from the syntax & semantic phases.
11 @param udts The UDTs from the syntax & semantic phases.
12 @param rule_names The NameList object (see class Api)for looking up
14 @param udt_names The NameList object for
15 looking up UDT name indexes.
16 @returns The rule dependencies object.
19 rule_range = range(
len(rules))
21 def scan(index, is_scanned):
22 rdi = rule_deps[index]
23 is_scanned[index] =
True
24 for op
in rules[index][
'opcodes']:
25 if(op[
'type'] == id.RNM):
26 rdop = rule_deps[op[
'index']]
27 rdi[
'refers_to'][op[
'index']] =
True
28 if(is_scanned[op[
'index']]
is False):
29 scan(op[
'index'], is_scanned)
31 if(rdop[
'refers_to'][j]):
32 rdi[
'refers_to'][j] =
True
33 for j
in range(udt_count):
34 if(rdop[
'refers_to_udt'][j]):
35 rdi[
'refers_to_udt'][j] =
True
36 elif(op[
'type'] == id.UDT):
37 rdi[
'refers_to_udt'][op[
'index']] =
True
38 elif(op[
'type'] == id.BKR):
39 lookup = rule_names.get(op[
'lower'])
41 lookup = udt_names.get(op[
'lower'])
44 'back referenced name is not a rule or UDT')
45 rdi[
'refers_to_udt'][lookup[
'index']] =
True
47 rdi[
'refers_to'][lookup[
'index']] =
True
50 rule_count =
len(rules)
55 'refers_to': [
False] * rule_count,
56 'is_referenced_by': [
False] * rule_count,
57 'refers_to_udt': [
False] * udt_count,
58 'recursive_type': id.ATTR_N,
64 is_scanned = [
False] * rule_count
70 if(rule_deps[j][
'refers_to'][i]):
71 rule_deps[i][
'is_referenced_by'][j] =
True
75 if(rule_deps[i][
'refers_to'][i]):
76 rule_deps[i][
'recursive_type'] = id.ATTR_R
82 if(rdi[
'recursive_type'] == id.ATTR_R):
87 if(rdj[
'recursive_type'] == id.ATTR_R):
88 if(rdi[
'refers_to'][j]
and rdj[
'refers_to'][i]):
92 rdi[
'recursive_type'] = id.ATTR_MR
93 rdi[
'group_no'] = group_count
94 rdj[
'recursive_type'] = id.ATTR_MR
95 rdj[
'group_no'] = group_count
100 '''Display the rule dependencies.
101 @param rule_deps The rule dependencies.
102 The returned object from the @ref rule_dependencies() function.
103 @param rules The rules from the syntax & semantic phases.
104 @param udts The UDTs from the syntax & semantic phases.
105 @param alpha If True (default), rules are listed alphabetically.
106 Otherwise, they are listed in the order in which they appear
107 in the grammar syntax.
108 @returns The display string.
112 def alpha_rules(val):
113 return rules[val][
'lower']
116 return udts[val][
'lower']
119 return rule_deps[val][
'recursive_type']
122 return rule_deps[val][
'group_no']
124 rule_count =
len(rules)
125 udt_count =
len(udts)
126 rule_range = range(rule_count)
127 udt_range = range(udt_count)
128 rule_alphas = [0] * rule_count
129 udt_alphas = [0] * udt_count
131 rule_alphas[i] = rules[i][
'index']
132 for i
in range(udt_count):
133 udt_alphas[i] = udts[i][
'index']
135 rule_alphas.sort(key=alpha_rules)
136 udt_alphas.sort(key=alpha_udts)
141 rlen =
len(rules[i][
'name'])
144 fmt =
'%' + str(length) +
's: '
145 show += (fmt +
'legend\n') % (
'')
146 show += (fmt +
'=> (rule refers to)\n') % (
'rule')
147 show += (fmt +
'<= (rule is referenced by)\n\n') % (
'rule')
148 for ii
in rule_range:
153 show += (fmt +
'=> ') % (rules[i][
'name'])
154 for kk
in rule_range:
155 if(rule_deps[i][
'refers_to'][kk]):
158 if(rule_deps[i][
'refers_to_udt'][kk]):
162 for jj
in rule_range:
164 k = rule_deps[i][
'refers_to'][j]
166 if(count % RULES_LINE == 0
and count > 1):
167 show += (
'\n' + fmt +
'=> ') % (
'')
168 show += rules[j][
'name']
169 if(count < counti - 1):
174 k = rule_deps[i][
'refers_to_udt'][j]
176 if(count % RULES_LINE == 0
and count > 1):
177 show += (
'\n' + fmt +
'=> ') % (
'')
178 show += udts[j][
'name']
179 if(count < counti - 1):
183 show += (fmt +
'<= ') % (
'')
185 for kk
in rule_range:
186 if(rule_deps[i][
'is_referenced_by'][kk]):
190 for jj
in rule_range:
192 k = rule_deps[i][
'is_referenced_by'][j]
194 if(count % RULES_LINE == 0
and count > 1):
195 show += (
'\n' + fmt +
'<= ') % (
'')
196 show += rules[j][
'name']
197 if(count < counti - 1):
def rule_dependencies(rules, udts, rule_names, udt_names)
Determine the rule dependencies and recursive types for each rule.
def display_deps(rule_deps, rules, udts, alpha=True)
Display the rule dependencies.