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 Arguments(Sequence
):
74 class Scope(Sequence
):
78 class Module(Sequence
):
82 class DataclassMeta(NodeMeta
):
83 def __new__(metacls
, clsname
, bases
, ns
):
84 cls
= super().__new
__(metacls
, clsname
, bases
, ns
)
85 wrap
= dataclasses
.dataclass(init
=True, eq
=False, unsafe_hash
=True, frozen
=False)
87 origin
= datacls
.__repr
__
88 datacls
.__repr
__ = lambda self
: f
"{hex(id(self))}@{origin(self)}"
93 class Dataclass(Node
, metaclass
=DataclassMeta
):
94 def __post_init__(self
):
95 for field
in dataclasses
.fields(self
):
97 value
= getattr(self
, key
)
98 if not isinstance(value
, field
.type):
99 raise ValueError(f
"{self.__class__.__name__}.{key}: {value!r}")
101 def clone(self
, **kwargs
):
102 return copy
.deepcopy(dataclasses
.replace(self
, **kwargs
))
105 class LiteralMeta(TokenMeta
):
106 def __new__(metacls
, clsname
, bases
, ns
, *, choices
=()):
107 ns
.setdefault("__choices__", choices
)
109 return super().__new
__(metacls
, clsname
, bases
, ns
)
112 yield from cls
.__choices
__
115 class Literal(Token
, metaclass
=LiteralMeta
):
118 def __new__(cls
, value
):
119 choices
= cls
.__choices
__
120 if isinstance(value
, Token
):
122 if choices
and value
not in choices
:
123 raise ValueError(value
)
125 return super().__new
__(cls
, value
)
128 class GPR(Literal
, choices
=("RA", "RB", "RC", "RS", "RSp", "RT", "RTp")):
132 class GPRZero(GPR
, choices
=("RA", "RB", "RC")):
136 class FPR(Literal
, choices
=("FPR", "FRA", "FRAp", "FRB", "FRBp", "FRC", "FRS", "FRSp", "FRT", "FRTp")):
140 class CR3(Literal
, choices
=("BF", "BFA")):
144 class CR5(Literal
, choices
=("BA", "BB", "BC", "BI", "BT")):
148 class XER(Literal
, choices
=("OV", "OV32", "CA", "CA32", "SO")):
152 class IntLiteral(Literal
):
156 class BinLiteral(IntLiteral
):
161 class HexLiteral(IntLiteral
):
162 r
"""0x[0-9A-Fa-f_]+"""
166 class DecLiteral(IntLiteral
):
167 r
"""(\d+(\.\d*)?|\.\d+)([eE][-+]? \d+)?"""
172 r
"""[A-Za-z_]+[A-Za-z0-9_]*"""
176 class Attribute(Dataclass
):
178 subject
: Node
= Node()
181 class StringLiteral(Literal
):
182 __STRING_ESCAPE
= r
"""(\\[0-9a-zA-Z._~!=&\^\-\\?'"])"""
183 __STRING_CHAR
= (r
"""([^"\\\n]|""" + __STRING_ESCAPE
+ ")")
184 __STRING
= ("[\"']" + __STRING_CHAR
+ "*" + "[\"']")
189 return f
"{hex(id(self))}@{self.__class__.__name__}({self.__str__()!r})"
192 class Whitespace(Token
):
196 class Linebreak(Token
):
200 class Comment(Token
):
201 r
"""[ ]*(?:\043|<!--)[^\n]*"""
213 class LBracket(Token
):
218 class RBracket(Token
):
223 class LParenthesis(Token
):
228 class RParenthesis(Token
):
233 class Call(Dataclass
):
238 class AssignOp(Token
):
243 class AssignIEAOp(Token
):
248 class Assign(Dataclass
):
253 class AssignIEA(Assign
):
287 r
"""(?:×si|×s|\*si|\*s)"""
292 r
"""(?:×ui|×u|\*ui|\*u)"""
371 class UnaryExpr(Dataclass
):
376 class BinaryExpr(Dataclass
):
382 class Keyword(Token
):
386 class FunctionKeyword(Token
):
391 class IfKeyword(Keyword
):
396 class ThenKeyword(Keyword
):
401 class ElseKeyword(Keyword
):
406 class LeaveKeyword(Keyword
):
411 class ForKeyword(Keyword
):
416 class ToKeyword(Keyword
):
421 class WhileKeyword(Keyword
):
426 class DoKeyword(Keyword
):
431 class ReturnKeyword(Keyword
):
436 class SwitchKeyword(Keyword
):
441 class CaseKeyword(Keyword
):
446 class DefaultKeyword(Keyword
):
476 class Semicolon(Token
):
481 class BitConcat(Token
):
486 class Question(Token
):
491 class Endmarker(Node
):
495 class IfExpr(Dataclass
):
501 class ForExpr(Dataclass
):
508 class WhileExpr(Dataclass
):
514 class RepeatExpr(Dataclass
):
519 class Subscript(Dataclass
):
521 subject
: Node
= Node()
524 class RangeSubscript(Dataclass
):
527 subject
: Node
= Node()
530 class Label(Literal
):
534 class DefaultLabel(Label
):
536 return super().__new
__(cls
, "default")
539 class Labels(Sequence
, typeid
=Label
):
543 class Case(Dataclass
):
548 class Cases(Sequence
, typeid
=Case
):
552 class SwitchExpr(Dataclass
):