You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.6 KiB
60 lines
1.6 KiB
import re
|
|
compound = {}
|
|
base_comp = set()
|
|
|
|
def get_input(comp):
|
|
ret = {}
|
|
ret['type'] = input('type: ').lower()
|
|
ret['parents'] = set()
|
|
if type == 'compound':
|
|
ret['sub'] = {}
|
|
first = True
|
|
while True:
|
|
i = input('sub: ' if first else '>').lower()
|
|
if i == 'end':
|
|
break
|
|
if i != ''
|
|
s = re.split(r' *\* ',i)
|
|
if len(s) == 2:
|
|
name,count = s
|
|
else:
|
|
name = s[0]
|
|
count = 0
|
|
ret[name] = int(count)
|
|
first = False
|
|
return ret
|
|
|
|
def get_sub(comp):
|
|
# either not base component or not entered yet
|
|
if comp not in base_comp:
|
|
try:
|
|
# check to see if it is already entered
|
|
subs = compound[comp]
|
|
except KeyError:
|
|
# entry
|
|
subs = get_input(comp)
|
|
|
|
if subs['type'] == 'base':
|
|
base_comp.add(comp)
|
|
else:
|
|
compound[comp] = subs
|
|
return subs
|
|
|
|
|
|
def __inner__(comp,count,bases,components,prev = None):
|
|
component_data = get_sub(comp)
|
|
if prev:
|
|
component_data['parents'].add(prev)
|
|
# not a compound component
|
|
if component_data is None:
|
|
prev = bases.get(comp,0)
|
|
bases[comp] = prev + count
|
|
else:
|
|
prev = components.get(comp,0)
|
|
components[comp] = prev + count
|
|
for sub,count in component_data['sub']:
|
|
__inner__(sub,count,bases,components,comp)
|
|
|
|
def get_overall_usage(comp):
|
|
ret_bases = {}
|
|
ret_components = {}
|