9 class Node(metaclass
=NodeMeta
):
11 return f
"{hex(id(self))}@{self.__class__.__name__}()"
13 def __eq__(self
, other
):
14 if not isinstance(other
, self
.__class
__):
16 return (hex(id(self
)) == id(other
))
19 return copy
.deepcopy(self
)
22 class TokenMeta(NodeMeta
):
26 class Token(Node
, str, metaclass
=TokenMeta
):
27 def __new__(cls
, value
):
28 if isinstance(value
, cls
):
30 if not isinstance(value
, str):
31 raise ValueError(value
)
33 return super().__new
__(cls
, value
)
36 return super(Node
, self
).__str
__()
39 return super(Node
, self
).__hash
__()
42 return f
"{hex(id(self))}@{self.__class__.__name__}({str(self)})"
45 class SequenceMeta(NodeMeta
):
48 def __new__(metacls
, clsname
, bases
, ns
, *, typeid
=Node
):
49 ns
.setdefault("__typeid__", typeid
)
51 return super().__new
__(metacls
, clsname
, bases
, ns
)
54 class Sequence(Node
, tuple, metaclass
=SequenceMeta
):
55 def __new__(cls
, iterable
=tuple()):
57 if not isinstance(item
, cls
.__typeid
__):
58 raise ValueError(cls
, item
)
61 return super().__new
__(cls
, map(validate
, iterable
))
64 return super(Node
, self
).__hash
__()
67 return f
"{hex(id(self))}@{self.__class__.__name__}({repr(list(self))})"
70 class Scope(Sequence
):
74 class Module(Sequence
):
78 class DataclassMeta(NodeMeta
):
79 def __new__(metacls
, clsname
, bases
, ns
):
80 cls
= super().__new
__(metacls
, clsname
, bases
, ns
)
81 wrap
= dataclasses
.dataclass(init
=True, eq
=False, unsafe_hash
=True, frozen
=False)
83 origin
= datacls
.__repr
__
84 datacls
.__repr
__ = lambda self
: f
"{hex(id(self))}@{origin(self)}"
89 class Dataclass(Node
, metaclass
=DataclassMeta
):
90 def __post_init__(self
):
91 for field
in dataclasses
.fields(self
):
93 value
= getattr(self
, key
)
94 if not isinstance(value
, field
.type):
95 raise ValueError(f
"{self.__class__.__name__}.{key}: {value!r}")
97 def clone(self
, **kwargs
):
98 return copy
.deepcopy(dataclasses
.replace(self
, **kwargs
))
101 class LiteralMeta(TokenMeta
):
102 def __new__(metacls
, clsname
, bases
, ns
, *, choices
=()):
103 ns
.setdefault("__choices__", choices
)
105 return super().__new
__(metacls
, clsname
, bases
, ns
)
108 yield from cls
.__choices
__
111 class Literal(Token
, metaclass
=LiteralMeta
):
114 def __new__(cls
, value
):
115 choices
= cls
.__choices
__
116 if isinstance(value
, Token
):
118 if choices
and value
not in choices
:
119 raise ValueError(value
)
121 return super().__new
__(cls
, value
)
124 class GPR(Literal
, choices
=("RA", "RB", "RC", "RS", "RSp", "RT", "RTp")):
128 class GPRZero(GPR
, choices
=("RA", "RB", "RC")):
132 class FPR(Literal
, choices
=("FPR", "FRA", "FRAp", "FRB", "FRBp", "FRC", "FRS", "FRSp", "FRT", "FRTp")):
136 class CR3(Literal
, choices
=("BF", "BFA")):
140 class CR5(Literal
, choices
=("BA", "BB", "BC", "BI", "BT")):
144 class XER(Literal
, choices
=("OV", "OV32", "CA", "CA32", "SO")):
148 class IntLiteral(Literal
):
152 class BinLiteral(IntLiteral
):
157 class HexLiteral(IntLiteral
):
158 r
"""0x[0-9A-Fa-f_]+"""
162 class DecLiteral(IntLiteral
):
163 r
"""(\d+(\.\d*)?|\.\d+)([eE][-+]? \d+)?"""
168 r
"""[A-Za-z_]+[A-Za-z0-9_]*"""
172 class Attribute(Dataclass
):
174 subject
: Node
= Node()
177 class StringLiteral(Literal
):
178 __STRING_ESCAPE
= r
"""(\\[0-9a-zA-Z._~!=&\^\-\\?'"])"""
179 __STRING_CHAR
= (r
"""([^"\\\n]|""" + __STRING_ESCAPE
+ ")")
180 __STRING
= ("[\"']" + __STRING_CHAR
+ "*" + "[\"']")
185 return f
"{hex(id(self))}@{self.__class__.__name__}({self.__str__()!r})"
188 class Whitespace(Token
):
192 class Linebreak(Token
):
196 class Comment(Token
):
197 r
"""[ ]*(?:\043|<!--)[^\n]*"""
209 class LBracket(Token
):
214 class RBracket(Token
):
219 class LParenthesis(Token
):
224 class RParenthesis(Token
):
229 class Call(Dataclass
):
233 class Arguments(Sequence
):
240 class AssignOp(Token
):
245 class AssignIEAOp(Token
):
250 class AssignExpr(Dataclass
):
255 class AssignIEAExpr(AssignExpr
):
289 r
"""(?:×si|×s|\*si|\*s)"""
294 r
"""(?:×ui|×u|\*ui|\*u)"""
373 class UnaryExpr(Dataclass
):
378 class BinaryExpr(Dataclass
):
384 class Keyword(Token
):
388 class FunctionKeyword(Token
):
393 class IfKeyword(Keyword
):
398 class ThenKeyword(Keyword
):
403 class ElseKeyword(Keyword
):
408 class LeaveKeyword(Keyword
):
413 class ForKeyword(Keyword
):
418 class ToKeyword(Keyword
):
423 class WhileKeyword(Keyword
):
428 class DoKeyword(Keyword
):
433 class ReturnKeyword(Keyword
):
438 class SwitchKeyword(Keyword
):
443 class CaseKeyword(Keyword
):
448 class DefaultKeyword(Keyword
):
478 class Semicolon(Token
):
483 class BitConcat(Token
):
488 class Question(Token
):
493 class Endmarker(Node
):
497 class IfExpr(Dataclass
):
503 class ForExpr(Dataclass
):
510 class WhileExpr(Dataclass
):
516 class RepeatExpr(Dataclass
):
521 class Subscript(Dataclass
):
523 subject
: Node
= Node()
526 class RangeSubscript(Dataclass
):
529 subject
: Node
= Node()
532 class Label(Literal
):
536 class DefaultLabel(Label
):
538 return super().__new
__(cls
, "default")
541 class Labels(Sequence
, typeid
=Label
):
545 class Case(Dataclass
):
550 class Cases(Sequence
, typeid
=Case
):
554 class SwitchExpr(Dataclass
):