diff options
Diffstat (limited to 'Tools/cases_generator/parser.py')
-rw-r--r-- | Tools/cases_generator/parser.py | 19 |
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]]: |