From 89d267e9bd6e10309bc5c40228536880032746b7 Mon Sep 17 00:00:00 2001 From: Mathis Salmen Date: Wed, 21 Feb 2024 17:05:12 +0100 Subject: [PATCH] Parse multiple InstrSets (fixes #14), optional boilerplate scopes --- llvm/tools/pattern-gen/lib/Parser.cpp | 74 +++++++++++++++------------ 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/llvm/tools/pattern-gen/lib/Parser.cpp b/llvm/tools/pattern-gen/lib/Parser.cpp index 629259e4051f6..7c005e1b544b8 100644 --- a/llvm/tools/pattern-gen/lib/Parser.cpp +++ b/llvm/tools/pattern-gen/lib/Parser.cpp @@ -1091,45 +1091,53 @@ std::vector ParseCoreDSL2(TokenStream& ts, llvm::Module* mod) { std::vector instrs; - // boilerplate - pop_cur(ts, Identifier); - pop_cur(ts, Identifier); - if (pop_cur_if(ts, ExtendsKeyword)) - pop_cur(ts, Identifier); - pop_cur(ts, CBrOpen); - pop_cur(ts, InstructionsKeyword); - pop_cur(ts, CBrOpen); - - while (ts.Peek().type != CBrClose) + while(ts.Peek().type != None) { - reset_globals(); - Token ident = pop_cur(ts, Identifier); - pop_cur(ts, CBrOpen); - CDSLInstr instr{.name = std::string(ident.ident.str)}; - curInstr = &instr; + bool parseBoilerplate = ts.Peek().type == Identifier && ts.Peek().ident.str == "InstructionSet"; + if (parseBoilerplate) + { + pop_cur(ts, Identifier); + pop_cur(ts, Identifier); + if (pop_cur_if(ts, ExtendsKeyword)) + pop_cur(ts, Identifier); + pop_cur(ts, CBrOpen); + pop_cur(ts, InstructionsKeyword); + pop_cur(ts, CBrOpen); + } - while (ts.Peek().type != CBrClose) + while (ts.Peek().type != CBrClose && ts.Peek().type != None) { - switch (ts.Peek().type) + reset_globals(); + Token ident = pop_cur(ts, Identifier); + pop_cur(ts, CBrOpen); + CDSLInstr instr{.name = std::string(ident.ident.str)}; + curInstr = &instr; + + while (ts.Peek().type != CBrClose) { - case EncodingKeyword: - ParseEncoding(ts, instr); - break; - case AssemblyKeyword: - ParseArguments(ts, instr); - break; - case BehaviorKeyword: - ParseBehaviour(ts, instr, mod, ident); - break; - default: syntax_error(ts); + switch (ts.Peek().type) + { + case EncodingKeyword: + ParseEncoding(ts, instr); + break; + case AssemblyKeyword: + ParseArguments(ts, instr); + break; + case BehaviorKeyword: + ParseBehaviour(ts, instr, mod, ident); + break; + default: syntax_error(ts); + } } + pop_cur(ts, CBrClose); + instrs.push_back(instr); + } + + if (parseBoilerplate) + { + pop_cur(ts, CBrClose); + pop_cur(ts, CBrClose); } - pop_cur(ts, CBrClose); - instrs.push_back(instr); } - - pop_cur(ts, CBrClose); - pop_cur(ts, CBrClose); - return instrs; }