File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1515from .printer import UnicodePrinter
1616from .transformer import SymPyBooleanTransformer
1717from .transformer import SymPyTransformer
18+ from .ast import SetNotation
Original file line number Diff line number Diff line change 11from abc import ABC
22from 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):
5859class Term (Set ):
5960 value : str
6061
62+ @dataclass
63+ class SetNotation (Set ):
64+ elements : Tuple [str , ...] = field (default_factory = tuple )
6165
6266class 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 )
Original file line number Diff line number Diff 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
2729ID : / [A-Z ]/
2830universe : " Ω" | " Omega"
31+ ELEMENT : / [A-Za-z0-9 ]+ /
Original file line number Diff line number Diff line change 1717from .ast import Term
1818from .ast import Union
1919from .ast import Universe
20+ from .ast import SetNotation
2021
2122
2223class 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 ))
Original file line number Diff line number Diff line change 11from .ast import Set
2- from .ast import SetTransformer
2+ from .ast import SetTransformer , SetNotation
33
44
55class 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
3437class 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
6369class UnicodePrinter (SetTransformer ):
6470 def print (self , node : Set ):
Original file line number Diff line number Diff line change 99from sympy import Union
1010from sympy import UniversalSet
1111from sympy import Xor
12+ from sympy import Integer
1213
13- from .ast import SetTransformer
14+ from .ast import SetTransformer , SetNotation
1415
1516
1617class 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
4751class SymPyBooleanTransformer (SetTransformer ):
4852 def __init__ (self ):
You can’t perform that action at this time.
0 commit comments