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 Reserve(Literal
, choices
=("RESERVE", "RESERVE_LENGTH", "RESERVE_ADDR")):
152 class Overflow(Literal
, choices
=("overflow",)):
156 class Special(Literal
, choices
=(
157 "CR", "LR", "CTR", "TAR", "FPSCR", "MSR",
158 "SVSTATE", "SVREMAP", "SRR0", "SRR1",
159 "SVSHAPE0", "SVSHAPE1", "SVSHAPE2", "SVSHAPE3",
164 class XLEN(Literal
, choices
=("XLEN",)):
168 class IntLiteral(Literal
):
172 class BinLiteral(IntLiteral
):
177 class HexLiteral(IntLiteral
):
178 r
"""0x[0-9A-Fa-f_]+"""
182 class DecLiteral(IntLiteral
):
183 r
"""(\d+(\.\d*)?|\.\d+)([eE][-+]? \d+)?"""
188 r
"""[A-Za-z_]+[A-Za-z0-9_]*"""
192 class Attribute(Dataclass
):
194 subject
: Node
= Node()
197 class StringLiteral(Literal
):
198 __STRING_ESCAPE
= r
"""(\\[0-9a-zA-Z._~!=&\^\-\\?'"])"""
199 __STRING_CHAR
= (r
"""([^"\\\n]|""" + __STRING_ESCAPE
+ ")")
200 __STRING
= ("[\"']" + __STRING_CHAR
+ "*" + "[\"']")
205 return f
"{hex(id(self))}@{self.__class__.__name__}({self.__str__()!r})"
208 class Whitespace(Token
):
212 class Linebreak(Token
):
216 class Comment(Token
):
217 r
"""[ ]*(?:\043|<!--)[^\n]*"""
229 class LBracket(Token
):
234 class RBracket(Token
):
239 class LParenthesis(Token
):
244 class RParenthesis(Token
):
249 class Call(Dataclass
):
253 class Arguments(Sequence
):
260 class AssignOp(Token
):
265 class AssignIEAOp(Token
):
270 class AssignExpr(Dataclass
):
275 class AssignIEAExpr(AssignExpr
):
309 r
"""(?:×si|×s|\*si|\*s)"""
314 r
"""(?:×ui|×u|\*ui|\*u)"""
393 class UnaryExpr(Dataclass
):
398 class BinaryExpr(Dataclass
):
404 class Keyword(Token
):
408 class FunctionKeyword(Token
):
413 class IfKeyword(Keyword
):
418 class ThenKeyword(Keyword
):
423 class ElseKeyword(Keyword
):
428 class LeaveKeyword(Keyword
):
433 class ForKeyword(Keyword
):
438 class ToKeyword(Keyword
):
443 class WhileKeyword(Keyword
):
448 class DoKeyword(Keyword
):
453 class ReturnKeyword(Keyword
):
458 class SwitchKeyword(Keyword
):
463 class CaseKeyword(Keyword
):
468 class DefaultKeyword(Keyword
):
498 class Semicolon(Token
):
503 class BitConcat(Token
):
508 class Question(Token
):
513 class Endmarker(Node
):
517 class IfExpr(Dataclass
):
523 class ForExpr(Dataclass
):
530 class WhileExpr(Dataclass
):
536 class RepeatExpr(Dataclass
):
541 class Subscript(Dataclass
):
543 subject
: Node
= Node()
546 class RangeSubscript(Dataclass
):
549 subject
: Node
= Node()
552 class Label(Literal
):
556 class DefaultLabel(Label
):
558 return super().__new
__(cls
, "default")
561 class Labels(Sequence
, typeid
=Label
):
565 class Case(Dataclass
):
570 class Cases(Sequence
, typeid
=Case
):
574 class SwitchExpr(Dataclass
):