Showing
4 changed files
with
65 additions
and
18 deletions
... | @@ -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()) | ... | ... |
codanim/lang/__init__.py
0 → 100644
File mode changed
codanim/lang/c.py
0 → 100644
This diff is collapsed. Click to expand it.
-
Please register or login to post a comment