From a6b8afcfb61e1d321405fe8713beaec2aa6320a2 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sat, 17 Oct 2026 05:08:42 +0000 Subject: feat(input): support array elements and member targets Co-Authored-By: Claude Fable 5.1 --- lib/Parser/Parser.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'lib/Parser/Parser.cc') diff --git a/lib/Parser/Parser.cc b/lib/Parser/Parser.cc index f2fcbc8..d4d04d2 100644 --- a/lib/Parser/Parser.cc +++ b/lib/Parser/Parser.cc @@ -116,14 +116,17 @@ std::unique_ptr Parser::ParseStatementImpl() { std::string Name = Lex.IdentifierStr; int Line = Lex.getLine(); getNextToken(); - if (CurTok == '[' || CurTok == '.' || CurTok == '^') { - // Consume the whole designator so it cannot replay as statements. - std::vector Dummy; - ParseDesignatorSuffix(Dummy); - fprintf(stderr, "error: INPUT target must be a plain variable at line %d\n", Line); - return nullptr; - } - return std::make_unique(Name); + std::vector Accesses; + if (!ParseDesignatorSuffix(Accesses)) return nullptr; + std::unique_ptr Target; + if (Accesses.empty()) + Target = std::make_unique(Name); + else if (Accesses.size() == 1 && Accesses[0].Kind == AccessKind::Index) + Target = std::make_unique(Name, std::move(Accesses[0].Indices), Line); + else + Target = std::make_unique(Name, std::move(Accesses), Line); + Target->setLine(Line); + return std::make_unique(std::move(Target)); } else if (CurTok == tok_output) { getNextToken(); -- cgit v1.3.1-4-g156e