From 8c4f285f0e70789c2c0f316e482ec56ceab1c25f Mon Sep 17 00:00:00 2001 From: Anders Blomdell <anders.blomdell@control.lth.se> Date: Tue, 21 Apr 2020 16:01:05 +0200 Subject: [PATCH] Add initial AUTO code expansion --- robotlab_safety/pluto_auto.py | 88 ++++++++++++++++++++++++++++++++ robotlab_safety/safety_2020.sps | Bin 53856 -> 54014 bytes 2 files changed, 88 insertions(+) create mode 100755 robotlab_safety/pluto_auto.py diff --git a/robotlab_safety/pluto_auto.py b/robotlab_safety/pluto_auto.py new file mode 100755 index 0000000..957400d --- /dev/null +++ b/robotlab_safety/pluto_auto.py @@ -0,0 +1,88 @@ +#!/usr/bin/python3 + +import argparse +import sys +import re +import tempfile +import os + +class PlutoVariables: + + def __init__(self, prefix): + self.prefix = prefix + self.by_name = dict() + + def add(self, name, pluto, index): + self.by_name[name] = (int(pluto), int(index)) + pass + + def codegen(self, expr): + m = re.match('([^=]+)=ALL\((.*)\)', expr) + if m: + lh = m.group(1) + regexp = m.group(2).replace('*', '.*') + rh = [ "(%s+/SM_Pluto%d_Present)" % (v, self.by_name[v][0]) + for v in self.by_name if re.match(regexp, v)] + return("%s=%s" % (lh, '*'.join(rh))) + raise Exception('Invalid expression', expr) + + +class SPS: + + def __init__(self, path): + self.data = open(path, encoding='utf-16').read() + self.gm = PlutoVariables('GM') + self.parse() + + def parse(self): + for l in self.data.split('\n'): + # Collect variables + m = re.match('! GM([0-9]+)[.]([0-9]+)=(\S+)', l) + if m: + self.gm.add(m.group(3), m.group(1), m.group(2)) + pass + pass + pass + + def expand(self): + result = [] + for l in self.data.split('\n'): + result.append(l) + m = re.match(';\s*AUTO:\s*(.*)', l) + if m: + code = self.gm.codegen(m.group(1)) + if code != result[-2]: + result[-2] = code + pass + pass + pass + return '\n'.join(result) + + +if __name__ == '__main__': + optParser = argparse.ArgumentParser() + optParser.add_argument("sps", nargs='+', + help="Pluto master programs") + optParser.add_argument("--write", + action="store_true", default=False, + help="Rewrite source file if needed") + options = optParser.parse_args(sys.argv[1:]) + for f in options.sps: + sps = SPS(f) + orig = sps.data + expanded = sps.expand() + if orig != expanded: + if options.write: + f1 = tempfile.NamedTemporaryFile(dir=os.path.dirname(f), + delete=False) + print(f1.name) + f1.write(expanded.replace('\n', '\r\n').encode('utf-16')) + f1.close() + os.rename(f1.name, f) + pass + else: + for w, (l1, l2) in enumerate(zip(orig.split('\n'), + expanded.split('\n'))): + if (l1!=l2): + print("%d '%s'" % (w, l1)) + print("%d '%s'" % (w, l2)) diff --git a/robotlab_safety/safety_2020.sps b/robotlab_safety/safety_2020.sps index 3b5a3d645686894fbc079f485c88c191ec417770..00fc7aa83d45e510da98386a3d41c48015cd5b6a 100644 GIT binary patch delta 127 zcmaE`g!$i6<_&zZleG?U2?j72GsH8vG6XY}Fyu27FxXDse?fIJhn&#lfOv_`39{Q9 yp~_6KD09&g+8hu+D`~R9g$a{49TH*$=~mwybtsKbIDo;B!4Or?=KU8IG6Db@G$_*m delta 79 zcmeyjl=;CD<_&zZ%y|rzllSMyGxIWVO};N6x;a7ioFhzdb4L88q{&PNRVEiPi3svC ea4}djI5LDXgfRFsSTQJU-g~H*Z*$zm1&jbZBN^}j -- GitLab