Franck Pommereau

untested C to Python-simulator translator

...@@ -47,6 +47,12 @@ class CAni (object) : ...@@ -47,6 +47,12 @@ class CAni (object) :
47 @RET.setter 47 @RET.setter
48 def RET (self, val) : 48 def RET (self, val) :
49 dict.__setitem__(self._env, "RET", val) 49 dict.__setitem__(self._env, "RET", val)
50 + @property
51 + def CASE (self) :
52 + return self._env.get("CASE", None)
53 + @CASE.setter
54 + def CASE (self, val) :
55 + dict.__setitem__(self._env, "CASE", val)
50 def exec (self, code) : 56 def exec (self, code) :
51 self._env.exec(code) 57 self._env.exec(code)
52 def eval (self, code) : 58 def eval (self, code) :
......
...@@ -46,6 +46,9 @@ class _CODE (CAni) : ...@@ -46,6 +46,9 @@ class _CODE (CAni) :
46 for key, val in self.items() : 46 for key, val in self.items() :
47 if isinstance(val, _CODE) : 47 if isinstance(val, _CODE) :
48 sub[key] = val.source() 48 sub[key] = val.source()
49 + elif isinstance(val, (list, tuple)) :
50 + sub[key] = "".join(v.source() if isinstance(v, _CODE) else str(v)
51 + for v in val)
49 else : 52 else :
50 sub[key] = val 53 sub[key] = val
51 return self.src.format(**sub) 54 return self.src.format(**sub)
...@@ -64,8 +67,29 @@ class _CODE (CAni) : ...@@ -64,8 +67,29 @@ class _CODE (CAni) :
64 else : 67 else :
65 return tex 68 return tex
66 69
70 +class RAW (_CODE) :
71 + _fields = []
72 + @autorepr
73 + def __init__ (self, src) :
74 + super().__init__(src=src)
75 + def __call__ (self) :
76 + pass
77 +
78 +class WS (RAW) :
79 + _fields = []
80 + def tex (self) :
81 + return self.src
82 +
67 class BLOCK (_CODE) : 83 class BLOCK (_CODE) :
68 _fields = ["*body"] 84 _fields = ["*body"]
85 + def __init__ (self, *l, **k) :
86 + super().__init__(*l, **k)
87 + self.body = list(self.body)
88 + def __repr__ (self) :
89 + return "{}({}{}{})".format(self.__class__.__name__,
90 + ", ".join(repr(b) for b in self.body),
91 + ", " if self.body and self.src else "",
92 + "src={}".format(self.src) if self.src else "")
69 def __call__ (self) : 93 def __call__ (self) :
70 self._at.add(self.IP) 94 self._at.add(self.IP)
71 for code in self.body : 95 for code in self.body :
...@@ -74,6 +98,15 @@ class BLOCK (_CODE) : ...@@ -74,6 +98,15 @@ class BLOCK (_CODE) :
74 return "".join(b.source() for b in self.body) 98 return "".join(b.source() for b in self.body)
75 def tex (self) : 99 def tex (self) :
76 return "".join(b.tex() for b in self.body) 100 return "".join(b.tex() for b in self.body)
101 + def append (self, code) :
102 + if not self.body :
103 + self.body.append(code)
104 + elif isinstance(self.body[-1], RAW) and isinstance(code, RAW) :
105 + self.body[-1] = RAW(self.body[-1].src + code.src)
106 + elif isinstance(code, RAW) and not code.src :
107 + pass
108 + else :
109 + self.body.append(code)
77 110
78 class STMT (_CODE) : 111 class STMT (_CODE) :
79 _fields = ["*steps"] 112 _fields = ["*steps"]
...@@ -113,24 +146,6 @@ class ENV (_CODE) : ...@@ -113,24 +146,6 @@ class ENV (_CODE) :
113 def source (self) : 146 def source (self) :
114 return "" 147 return ""
115 148
116 -class WS (_CODE) :
117 - _fields = []
118 - @autorepr
119 - def __init__ (self, src) :
120 - super().__init__(src=src)
121 - def __call__ (self) :
122 - pass
123 - def tex (self) :
124 - return self.src
125 -
126 -class RAW (_CODE) :
127 - _fields = []
128 - @autorepr
129 - def __init__ (self, src) :
130 - super().__init__(src=src)
131 - def __call__ (self) :
132 - pass
133 -
134 class XDECL (_CODE) : 149 class XDECL (_CODE) :
135 _fields = ["*names"] 150 _fields = ["*names"]
136 def __call__ (self) : 151 def __call__ (self) :
...@@ -169,6 +184,9 @@ class BreakLoop (Exception) : ...@@ -169,6 +184,9 @@ class BreakLoop (Exception) :
169 pass 184 pass
170 185
171 class BREAK (_CODE) : 186 class BREAK (_CODE) :
187 + def __init__ (self) :
188 + super().__init__()
189 + self.src = "break"
172 def __call__ (self) : 190 def __call__ (self) :
173 self._at.add(self.IP) 191 self._at.add(self.IP)
174 self.IP += 1 192 self.IP += 1
...@@ -243,3 +261,26 @@ class FUNC (_CODE) : ...@@ -243,3 +261,26 @@ class FUNC (_CODE) :
243 self.body() 261 self.body()
244 except FunctionReturn as exc : 262 except FunctionReturn as exc :
245 self._env["RET"] = exc.RET 263 self._env["RET"] = exc.RET
264 +
265 +class SWITCH (_CODE) :
266 + _fields = ["cond", "*cases"]
267 + def __call__ (self) :
268 + self.cond()
269 + cond = self.RET
270 + try :
271 + for case in self.cases :
272 + self.CASE = cond
273 + case()
274 + except BreakLoop :
275 + pass
276 +
277 +class CASE (_CODE) :
278 + _fields = ["value", "body"]
279 + def __call__ (self) :
280 + self.value()
281 + if self.RET == self.CASE :
282 + self.body()
283 +
284 +class DEFAULT (BLOCK) :
285 + def source (self) :
286 + return self.src.format(body=super().source())
......
File mode changed
This diff is collapsed. Click to expand it.