diff --git a/robotlab_safety/pluto_auto.py b/robotlab_safety/pluto_auto.py index aad70ace26af7a7c20c90b658d35d160a5a4d782..1c509d05816023fa95a08cff5f2829f4702b21da 100755 --- a/robotlab_safety/pluto_auto.py +++ b/robotlab_safety/pluto_auto.py @@ -17,23 +17,26 @@ class PlutoVariables: pass def codegen(self, expr): - m = re.match('([^=]+)=AND\{(.*),(.*)\}', expr) + m = re.match('([^=]+)=(AND|OR)\{(.*),(.*)\}', expr) if m: lh = m.group(1) - regexp = m.group(2).replace('*', '.*') - rh = [ m.group(3).format(v, pluto=self.by_name[v][0]) - for v in self.by_name if re.match(regexp, v)] - return("%s=%s" % (lh, '*'.join(rh))) - m = re.match('([^=]+)=OR\{(.*),(.*)\}', expr) - if m: - lh = m.group(1) - regexp = m.group(2).replace('*', '.*') - rh = [ m.group(3).format(v, pluto=self.by_name[v][0]) - for v in self.by_name if re.match(regexp, v)] - return("%s=%s" % (lh, '+'.join(rh))) + op = m.group(2) + regexp = m.group(3).replace('*', '.*') + expr = m.group(4) + rh = [] + for k,v in sorted(self.by_name.items()): + rh_m = re.match(regexp, k) + if rh_m: + matches = (k,)+rh_m.groups() + rh.append(expr.format(*matches, pluto=v[0])) + pass + pass + if op == 'AND': + return("%s=%s" % (lh, '*'.join(rh))) + elif op == 'OR': + return("%s=%s" % (lh, '+'.join(rh))) raise Exception('Invalid expression', expr) - class SPS: def __init__(self, path): diff --git a/robotlab_safety/safety_2020.sps b/robotlab_safety/safety_2020.sps index ee34758432839b35543cfa953662fb5b4fbd4fc9..d99544cff6b84fd63ddda81b2e6ef2fde151cff0 100644 Binary files a/robotlab_safety/safety_2020.sps and b/robotlab_safety/safety_2020.sps differ