summaryrefslogtreecommitdiffstats
path: root/Tools/cases_generator/parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/cases_generator/parser.py')
-rw-r--r--Tools/cases_generator/parser.py19
1 files changed, 12 insertions, 7 deletions
diff --git a/Tools/cases_generator/parser.py b/Tools/cases_generator/parser.py
index d802c73..4885394 100644
--- a/Tools/cases_generator/parser.py
+++ b/Tools/cases_generator/parser.py
@@ -84,7 +84,8 @@ UOp = OpName | CacheEffect
@dataclass
class InstHeader(Node):
- kind: Literal["inst", "op"]
+ register: bool
+ kind: Literal["inst", "op", "legacy"] # Legacy means no (inputs -- outputs)
name: str
inputs: list[InputEffect]
outputs: list[OutputEffect]
@@ -92,7 +93,8 @@ class InstHeader(Node):
@dataclass
class InstDef(Node):
- kind: Literal["inst", "op"]
+ register: bool
+ kind: Literal["inst", "op", "legacy"]
name: str
inputs: list[InputEffect]
outputs: list[OutputEffect]
@@ -134,16 +136,19 @@ class Parser(PLexer):
def inst_def(self) -> InstDef | None:
if hdr := self.inst_header():
if block := self.block():
- return InstDef(hdr.kind, hdr.name, hdr.inputs, hdr.outputs, block)
+ return InstDef(
+ hdr.register, hdr.kind, hdr.name, hdr.inputs, hdr.outputs, block
+ )
raise self.make_syntax_error("Expected block")
return None
@contextual
def inst_header(self) -> InstHeader | None:
# inst(NAME)
- # | inst(NAME, (inputs -- outputs))
- # | op(NAME, (inputs -- outputs))
+ # | [register] inst(NAME, (inputs -- outputs))
+ # | [register] op(NAME, (inputs -- outputs))
# TODO: Make INST a keyword in the lexer.
+ register = bool(self.expect(lx.REGISTER))
if (tkn := self.expect(lx.IDENTIFIER)) and (kind := tkn.text) in ("inst", "op"):
if self.expect(lx.LPAREN) and (tkn := self.expect(lx.IDENTIFIER)):
name = tkn.text
@@ -151,10 +156,10 @@ class Parser(PLexer):
inp, outp = self.io_effect()
if self.expect(lx.RPAREN):
if (tkn := self.peek()) and tkn.kind == lx.LBRACE:
- return InstHeader(kind, name, inp, outp)
+ return InstHeader(register, kind, name, inp, outp)
elif self.expect(lx.RPAREN) and kind == "inst":
# No legacy stack effect if kind is "op".
- return InstHeader(kind, name, [], [])
+ return InstHeader(register, "legacy", name, [], [])
return None
def io_effect(self) -> tuple[list[InputEffect], list[OutputEffect]]: