diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-04 05:34:15 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-04 05:34:15 +0800 |
| commit | 183e2354e9fdd107be420cbb185c1d239434aa48 (patch) | |
| tree | ce5c42cb6e9790072d5dcf00d1d55cb7f6573ddc /backend/lib/MIR/MILexer.cpp | |
| parent | 67d6231fba98e776c0f442e5b6908e279c35e346 (diff) | |
| download | rcc-project-183e2354e9fdd107be420cbb185c1d239434aa48.tar.gz rcc-project-183e2354e9fdd107be420cbb185c1d239434aa48.tar.xz | |
[MIR] Add machine instruction parser and printer
Parse MachineFunction bodies in two passes and serialize the same MachineIR model in complete or readable form. Extend instruction attachments and memory operands required by the fixed LLVM MIR grammar, and cover deterministic parse-print round trips.
Diffstat (limited to 'backend/lib/MIR/MILexer.cpp')
| -rw-r--r-- | backend/lib/MIR/MILexer.cpp | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/backend/lib/MIR/MILexer.cpp b/backend/lib/MIR/MILexer.cpp index 816264e..f568cef 100644 --- a/backend/lib/MIR/MILexer.cpp +++ b/backend/lib/MIR/MILexer.cpp @@ -569,14 +569,25 @@ private: ++Offset; const std::string_view Number = slice(NumberBegin, Offset); - std::size_t NameBegin = Offset; - if (peek() == '.') { - ++Offset; - NameBegin = Offset; - while (!atEnd() && isIdentifierCharacter(peek())) - ++Offset; + if (peek() != '.') { + return stringToken(IsReference ? MITokenKind::MachineBasicBlock + : MITokenKind::MachineBasicBlockLabel, + Begin, Offset, {}, Number); } + ++Offset; + const std::size_t NameBegin = Offset; + if (peek() == '"') { + auto Quoted = scanQuotedString(Offset); + if (!Quoted) + return token(MITokenKind::Error, Begin, Offset); + Offset = Quoted->End; + return ownedStringToken(IsReference ? MITokenKind::MachineBasicBlock + : MITokenKind::MachineBasicBlockLabel, + Begin, Offset, std::move(Quoted->Value), Number); + } + while (!atEnd() && isIdentifierCharacter(peek())) + ++Offset; return stringToken(IsReference ? MITokenKind::MachineBasicBlock : MITokenKind::MachineBasicBlockLabel, Begin, Offset, slice(NameBegin, Offset), Number); @@ -597,13 +608,20 @@ private: if (!HasOptionalName) return token(Kind, Begin, Offset, Number); - std::size_t NameBegin = Offset; - if (peek() == '.') { - ++Offset; - NameBegin = Offset; - while (!atEnd() && isIdentifierCharacter(peek())) - ++Offset; + if (peek() != '.') + return stringToken(Kind, Begin, Offset, {}, Number); + + ++Offset; + const std::size_t NameBegin = Offset; + if (peek() == '"') { + auto Quoted = scanQuotedString(Offset); + if (!Quoted) + return token(MITokenKind::Error, Begin, Offset); + Offset = Quoted->End; + return ownedStringToken(Kind, Begin, Offset, std::move(Quoted->Value), Number); } + while (!atEnd() && isIdentifierCharacter(peek())) + ++Offset; return stringToken(Kind, Begin, Offset, slice(NameBegin, Offset), Number); } |
