syncraft 0.1.31__py3-none-any.whl → 0.1.32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of syncraft might be problematic. Click here for more details.
- syncraft/ast.py +7 -2
- syncraft/syntax.py +18 -12
- {syncraft-0.1.31.dist-info → syncraft-0.1.32.dist-info}/METADATA +1 -1
- {syncraft-0.1.31.dist-info → syncraft-0.1.32.dist-info}/RECORD +7 -7
- {syncraft-0.1.31.dist-info → syncraft-0.1.32.dist-info}/WHEEL +0 -0
- {syncraft-0.1.31.dist-info → syncraft-0.1.32.dist-info}/licenses/LICENSE +0 -0
- {syncraft-0.1.31.dist-info → syncraft-0.1.32.dist-info}/top_level.txt +0 -0
syncraft/ast.py
CHANGED
|
@@ -188,6 +188,11 @@ class AST:
|
|
|
188
188
|
|
|
189
189
|
@dataclass(frozen=True)
|
|
190
190
|
class Nothing(AST):
|
|
191
|
+
_instance = None
|
|
192
|
+
def __new__(cls):
|
|
193
|
+
if cls._instance is None:
|
|
194
|
+
cls._instance = super(Nothing, cls).__new__(cls)
|
|
195
|
+
return cls._instance
|
|
191
196
|
def __str__(self)->str:
|
|
192
197
|
return self.__class__.__name__
|
|
193
198
|
def __repr__(self)->str:
|
|
@@ -226,8 +231,8 @@ class Many(Generic[A], AST):
|
|
|
226
231
|
if len(bs) <= len(ret):
|
|
227
232
|
return Many(value = tuple(ret[i][1](bs[i]) for i in range(len(bs))))
|
|
228
233
|
else:
|
|
229
|
-
half = [ret[i][1](bs[i]) for i in range(len(
|
|
230
|
-
tmp = [ret[-1][1](bs[i]) for i in range(len(ret)
|
|
234
|
+
half = [ret[i][1](bs[i]) for i in range(len(ret))]
|
|
235
|
+
tmp = [ret[-1][1](bs[i]) for i in range(len(ret), len(bs))]
|
|
231
236
|
return Many(value = tuple(half + tmp))
|
|
232
237
|
return [v[0] for v in ret], inv
|
|
233
238
|
|
syncraft/syntax.py
CHANGED
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import (
|
|
4
4
|
Optional, Any, TypeVar, Generic, Callable, Tuple, cast,
|
|
5
|
-
Type, Literal
|
|
5
|
+
Type, Literal, List
|
|
6
6
|
)
|
|
7
7
|
from dataclasses import dataclass, field, replace
|
|
8
8
|
from functools import reduce
|
|
@@ -168,21 +168,27 @@ class Syntax(Generic[A, S]):
|
|
|
168
168
|
def sep_by(self,
|
|
169
169
|
sep: Syntax[B, S]) -> Syntax[Then[A, Choice[Many[Then[B, A]], Optional[Nothing]]], S]:
|
|
170
170
|
ret: Syntax[Then[A, Choice[Many[Then[B, A]], Optional[Nothing]]], S] = (self + (sep >> self).many().optional())
|
|
171
|
-
def f(a: Then[A, Choice[Many[A], Optional[Nothing]]]) -> Many[A]:
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
return Many(value = (
|
|
175
|
-
|
|
176
|
-
return Many(value = (
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
171
|
+
def f(a: Then[A, Choice[Many[Then[B, A]], Optional[Nothing]]]) -> Many[A]:
|
|
172
|
+
match a:
|
|
173
|
+
case Then(kind=ThenKind.BOTH, left=left, right=Choice(kind=ChoiceKind.RIGHT, value=Nothing())):
|
|
174
|
+
return Many(value = (left,))
|
|
175
|
+
case Then(kind=ThenKind.BOTH, left=left, right=Choice(kind=ChoiceKind.LEFT, value=Many(value=bs))):
|
|
176
|
+
return Many(value = (left,) + tuple([b.right for b in bs]))
|
|
177
|
+
case _:
|
|
178
|
+
raise ValueError(f"Bad data shape {a}")
|
|
179
|
+
|
|
180
|
+
def i(a: Many[A]) -> Then[A, Choice[Many[Then[B|None, A]], Optional[Nothing]]]:
|
|
180
181
|
assert len(a.value) >= 1, f"sep_by expect at least one element, got {len(a.value)}. {a}"
|
|
181
182
|
if len(a.value) == 1:
|
|
182
183
|
return Then(kind=ThenKind.BOTH, left=a.value[0], right=Choice(kind=ChoiceKind.RIGHT, value=Nothing()))
|
|
183
184
|
else:
|
|
184
|
-
|
|
185
|
-
|
|
185
|
+
v: List[Then[B|None, A]] = [Then(kind=ThenKind.RIGHT, right=x, left=None) for x in a.value[1:]]
|
|
186
|
+
return Then(kind= ThenKind.BOTH,
|
|
187
|
+
left=a.value[0],
|
|
188
|
+
right=Choice(kind=ChoiceKind.LEFT,
|
|
189
|
+
value=Many(value=tuple(v))))
|
|
190
|
+
ret = ret.bimap(f,i) # type: ignore
|
|
191
|
+
return ret.describe(
|
|
186
192
|
name='sep_by',
|
|
187
193
|
fixity='prefix',
|
|
188
194
|
parameter=(self, sep))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
syncraft/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
syncraft/algebra.py,sha256=0bf_kT4b5FeF6isxNESZPbv_nzhDAbbMEID7S0RMJmQ,15677
|
|
3
|
-
syncraft/ast.py,sha256=
|
|
3
|
+
syncraft/ast.py,sha256=4EzHOa72UzI3nehFkYZmgz3ex7l7zwiyhy75bchppNI,14454
|
|
4
4
|
syncraft/constraint.py,sha256=uT-ELzvv8J-s-Y1VYkXePUezseqCLhqzYUzFBYs0HsE,6418
|
|
5
5
|
syncraft/diagnostic.py,sha256=cgwcQnCcgrCRX3h-oGTDb5rcJAtitPV3LfH9eLvO93E,2837
|
|
6
6
|
syncraft/finder.py,sha256=L75A0bAjdlntWk-Y1rCeINBOzGeGdE_zHrTmcpQ7m9g,1875
|
|
@@ -8,9 +8,9 @@ syncraft/generator.py,sha256=C3N0Nxk9grN6iPxLHt1Ur2xzS5S-9LsNvMMc-ehd36E,12981
|
|
|
8
8
|
syncraft/parser.py,sha256=RkQwFv00rOI-n4kvG4baGVTdK46T-_Hw7OJ0FB7g72g,11379
|
|
9
9
|
syncraft/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
syncraft/sqlite3.py,sha256=Pq09IHZOwuWg5W82l9D1flzd36QV0TOHQpTJ5U02V8g,34701
|
|
11
|
-
syncraft/syntax.py,sha256=
|
|
12
|
-
syncraft-0.1.
|
|
13
|
-
syncraft-0.1.
|
|
14
|
-
syncraft-0.1.
|
|
15
|
-
syncraft-0.1.
|
|
16
|
-
syncraft-0.1.
|
|
11
|
+
syncraft/syntax.py,sha256=ZqprL1EB8NFusM0Pcz9_uufLL4RTyzUAvMLkG14dOvU,17704
|
|
12
|
+
syncraft-0.1.32.dist-info/licenses/LICENSE,sha256=wHSV424U5csa3339dy1AZbsz2xsd0hrkMx2QK48CcUk,1062
|
|
13
|
+
syncraft-0.1.32.dist-info/METADATA,sha256=6jkJsi6ayD-miCVzm2Xm2hK385HkbfZeaAOUBTwhyp4,1041
|
|
14
|
+
syncraft-0.1.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
15
|
+
syncraft-0.1.32.dist-info/top_level.txt,sha256=Kq3t8ESXB2xW1Xt3uPmkENFc-c4f2pamNmaURBk7zc8,9
|
|
16
|
+
syncraft-0.1.32.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|