Skip to content

Commit 8a687d3

Browse files
authored
Added functionality for set notation (#8)
1 parent b6c3eac commit 8a687d3

6 files changed

Lines changed: 29 additions & 4 deletions

File tree

lf_toolkit/parse/set/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@
1515
from .printer import UnicodePrinter
1616
from .transformer import SymPyBooleanTransformer
1717
from .transformer import SymPyTransformer
18+
from .ast import SetNotation

lf_toolkit/parse/set/ast.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from abc import ABC
22
from abc import abstractmethod
3-
from dataclasses import dataclass
3+
from dataclasses import dataclass, field
4+
from typing import Tuple
45

56

67
@dataclass
@@ -58,6 +59,9 @@ class SymmetricDifference(BinaryOp):
5859
class Term(Set):
5960
value: str
6061

62+
@dataclass
63+
class SetNotation(Set):
64+
elements: Tuple[str, ...] = field(default_factory=tuple)
6165

6266
class Universe(Set):
6367
pass
@@ -80,6 +84,9 @@ def transform(self, node: Set):
8084
transformed_children.append(self.transform(node.left))
8185
transformed_children.append(self.transform(node.right))
8286

87+
if isinstance(node, SetNotation):
88+
transformed_children.append(node.elements)
89+
8390
# Dispatch to the specific transformation method based on node type
8491
method_name = type(node).__name__
8592
transformer = getattr(self, method_name, self.__unhandled_node)

lf_toolkit/parse/set/grammar/ascii.lark

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ start: expression
2222

2323
?group: "(" expression ")" -> group
2424

25-
?term: ID | universe
25+
?term: ID | universe | set_notation
26+
27+
set_notation: "{" (ELEMENT ("," ELEMENT)*)? "}"
2628

2729
ID: /[A-Z]/
2830
universe: "Ω" | "Omega"
31+
ELEMENT: /[A-Za-z0-9]+/

lf_toolkit/parse/set/parser.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from .ast import Term
1818
from .ast import Union
1919
from .ast import Universe
20+
from .ast import SetNotation
2021

2122

2223
class ParseError(Exception):
@@ -105,3 +106,6 @@ def universe(self, _):
105106

106107
def group(self, items):
107108
return Group(items[1] if self.latex else items[0])
109+
110+
def set_notation(self, items):
111+
return SetNotation(tuple(str(i) for i in items))

lf_toolkit/parse/set/printer.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from .ast import Set
2-
from .ast import SetTransformer
2+
from .ast import SetTransformer, SetNotation
33

44

55
class LatexPrinter(SetTransformer):
@@ -30,6 +30,9 @@ def Term(self, value):
3030
def Universe(self):
3131
return "\\Omega"
3232

33+
def SetNotation(self, elements):
34+
return "\\{" + ",".join(elements) + "\\}"
35+
3336

3437
class ASCIIPrinter(SetTransformer):
3538
def print(self, node: Set):
@@ -59,6 +62,9 @@ def Term(self, value):
5962
def Universe(self):
6063
return "Omega"
6164

65+
def SetNotation(self, elements):
66+
return "{" + ",".join(elements) + "}"
67+
6268

6369
class UnicodePrinter(SetTransformer):
6470
def print(self, node: Set):

lf_toolkit/parse/set/transformer.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
from sympy import Union
1010
from sympy import UniversalSet
1111
from sympy import Xor
12+
from sympy import Integer
1213

13-
from .ast import SetTransformer
14+
from .ast import SetTransformer, SetNotation
1415

1516

1617
class SymPyTransformer(SetTransformer):
@@ -43,6 +44,9 @@ def Term(self, expr):
4344
def Universe(self):
4445
return UniversalSet
4546

47+
def SetNotation(self, elements):
48+
return FiniteSet(*[Integer(e) if str(e).isdigit() else Symbol(e) for e in elements])
49+
4650

4751
class SymPyBooleanTransformer(SetTransformer):
4852
def __init__(self):

0 commit comments

Comments
 (0)