9 class Node(metaclass
=NodeMeta
):
11 return f
"{hex(id(self))}@{self.__class__.__name__}()"
16 def __eq__(self
, other
):
17 if not isinstance(other
, self
.__class
__):
19 return (hex(id(self
)) == id(other
))
22 return copy
.deepcopy(self
)
25 class TokenMeta(NodeMeta
):
29 class Token(Node
, str, metaclass
=TokenMeta
):
30 def __new__(cls
, value
):
31 if isinstance(value
, cls
):
33 if not isinstance(value
, str):
34 raise ValueError(value
)
36 return super().__new
__(cls
, value
)
39 return super(Node
, self
).__str
__()
42 return super(Node
, self
).__hash
__()
45 return f
"{hex(id(self))}@{self.__class__.__name__}({str(self)})"
48 class SequenceMeta(NodeMeta
):
51 def __new__(metacls
, clsname
, bases
, ns
, *, typeid
=Node
):
52 ns
.setdefault("__typeid__", typeid
)
54 return super().__new
__(metacls
, clsname
, bases
, ns
)
57 class Sequence(Node
, tuple, metaclass
=SequenceMeta
):
58 def __new__(cls
, iterable
=tuple()):
60 if not isinstance(item
, cls
.__typeid
__):
61 raise ValueError(cls
, item
)
64 return super().__new
__(cls
, map(validate
, iterable
))
67 return super(Node
, self
).__hash
__()
70 return f
"{hex(id(self))}@{self.__class__.__name__}({repr(list(self))})"
73 class Scope(Sequence
):
77 class Module(Sequence
):
81 class DataclassMeta(NodeMeta
):
82 def __new__(metacls
, clsname
, bases
, ns
):
83 cls
= super().__new
__(metacls
, clsname
, bases
, ns
)
84 wrap
= dataclasses
.dataclass(init
=True, eq
=False, unsafe_hash
=True, frozen
=False)
86 origin
= datacls
.__repr
__
87 datacls
.__repr
__ = lambda self
: f
"{hex(id(self))}@{origin(self)}"
92 class Dataclass(Node
, metaclass
=DataclassMeta
):
93 def __post_init__(self
):
94 for field
in dataclasses
.fields(self
):
96 value
= getattr(self
, key
)
97 if not isinstance(value
, field
.type):
98 raise ValueError(f
"{self.__class__.__name__}.{key}: {value!r}")
100 def clone(self
, **kwargs
):
101 return copy
.deepcopy(dataclasses
.replace(self
, **kwargs
))
104 class LiteralMeta(TokenMeta
):
105 def __new__(metacls
, clsname
, bases
, ns
, *, choices
=()):
106 ns
.setdefault("__choices__", choices
)
108 return super().__new
__(metacls
, clsname
, bases
, ns
)
111 yield from cls
.__choices
__
114 class Literal(Token
, metaclass
=LiteralMeta
):
117 def __new__(cls
, value
):
118 choices
= cls
.__choices
__
119 if isinstance(value
, Token
):
121 if choices
and value
not in choices
:
122 raise ValueError(value
)
124 return super().__new
__(cls
, value
)
127 class GPR(Literal
, choices
=("RA", "RB", "RC", "RS", "RSp", "RT", "RTp")):
131 class GPRZero(GPR
, choices
=("RA", "RB", "RC")):
135 class FPR(Literal
, choices
=("FPR", "FRA", "FRAp", "FRB", "FRBp", "FRC", "FRS", "FRSp", "FRT", "FRTp")):
139 class CR3(Literal
, choices
=("BF", "BFA")):
143 class CR5(Literal
, choices
=("BA", "BB", "BC", "BI", "BT")):
147 class XER(Literal
, choices
=("OV", "OV32", "CA", "CA32", "SO")):
151 class Reserve(Literal
, choices
=("RESERVE", "RESERVE_LENGTH", "RESERVE_ADDR")):
155 class Overflow(Literal
, choices
=("overflow",)):
159 class Special(Literal
, choices
=(
160 "CR", "LR", "CTR", "TAR", "FPSCR", "MSR",
161 "SVSTATE", "SVREMAP", "SRR0", "SRR1",
162 "SVSHAPE0", "SVSHAPE1", "SVSHAPE2", "SVSHAPE3",
167 class XLEN(Literal
, choices
=("XLEN",)):
171 class IntLiteral(Literal
):
175 class BinLiteral(IntLiteral
):
180 class HexLiteral(IntLiteral
):
181 r
"""0x[0-9A-Fa-f_]+"""
185 class DecLiteral(IntLiteral
):
186 r
"""(\d+(\.\d*)?|\.\d+)([eE][-+]? \d+)?"""
191 r
"""[A-Za-z_]+[A-Za-z0-9_]*"""
195 class Attribute(Dataclass
):
197 subject
: Node
= Node()
200 class StringLiteral(Literal
):
201 __STRING_ESCAPE
= r
"""(\\[0-9a-zA-Z._~!=&\^\-\\?'"])"""
202 __STRING_CHAR
= (r
"""([^"\\\n]|""" + __STRING_ESCAPE
+ ")")
203 __STRING
= ("[\"']" + __STRING_CHAR
+ "*" + "[\"']")
208 return f
"{hex(id(self))}@{self.__class__.__name__}({self.__str__()!r})"
211 class Whitespace(Token
):
215 class Linebreak(Token
):
219 class Comment(Token
):
220 r
"""[ ]*(?:\043|<!--)[^\n]*"""
232 class LBracket(Token
):
237 class RBracket(Token
):
242 class LParenthesis(Token
):
247 class RParenthesis(Token
):
252 class Call(Dataclass
):
256 class Arguments(Sequence
):
263 class AssignOp(Token
):
268 class AssignIEAOp(Token
):
273 class AssignExpr(Dataclass
):
278 class AssignIEAExpr(AssignExpr
):
312 r
"""(?:×si|×s|\*si|\*s)"""
317 r
"""(?:×ui|×u|\*ui|\*u)"""
396 class UnaryExpr(Dataclass
):
401 class BinaryExpr(Dataclass
):
407 class Keyword(Token
):
411 class FunctionKeyword(Token
):
416 class IfKeyword(Keyword
):
421 class ThenKeyword(Keyword
):
426 class ElseKeyword(Keyword
):
431 class LeaveKeyword(Keyword
):
436 class ForKeyword(Keyword
):
441 class ToKeyword(Keyword
):
446 class WhileKeyword(Keyword
):
451 class DoKeyword(Keyword
):
456 class ReturnKeyword(Keyword
):
461 class SwitchKeyword(Keyword
):
466 class CaseKeyword(Keyword
):
471 class DefaultKeyword(Keyword
):
501 class Semicolon(Token
):
506 class BitConcat(Token
):
511 class Question(Token
):
516 class Endmarker(Node
):
520 class IfExpr(Dataclass
):
526 class ForExpr(Dataclass
):
533 class WhileExpr(Dataclass
):
539 class RepeatExpr(Dataclass
):
544 class SubscriptExpr(Dataclass
):
546 subject
: Node
= Node()
549 class RangeSubscriptExpr(Dataclass
):
552 subject
: Node
= Node()
555 class Label(Literal
):
559 class DefaultLabel(Label
):
561 return super().__new
__(cls
, "default")
564 class Labels(Sequence
, typeid
=Label
):
568 class Case(Dataclass
):
573 class Cases(Sequence
, typeid
=Case
):
577 class SwitchExpr(Dataclass
):