aboutsummaryrefslogtreecommitdiff
path: root/lib/Parser/ParserExpression.cc
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-22 03:55:22 +0000
committer_ov4 <ov4@ov4.org>2026-10-22 04:05:50 +0000
commit56e97d0ddd3fff2bee160bae04e8f659671f398d (patch)
treec12bee619f88d8be306117913a4e8e349c2d7797 /lib/Parser/ParserExpression.cc
parentcad64c865ae517a1d2925544e5f99ec3c414690b (diff)
refactor(parser): share the designator degrade rule for INPUT and expressions
INPUT targets and identifier expressions now build their legacy VariableExprAST/ArrayAccessExprAST/DesignatorExprAST node through makeDesignator(). INPUT still sets the target line explicitly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib/Parser/ParserExpression.cc')
-rw-r--r--lib/Parser/ParserExpression.cc14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/Parser/ParserExpression.cc b/lib/Parser/ParserExpression.cc
index 6ed3f1c..398ba84 100644
--- a/lib/Parser/ParserExpression.cc
+++ b/lib/Parser/ParserExpression.cc
@@ -112,12 +112,18 @@ std::unique_ptr<ExprAST> Parser::ParseIdentifierExpr() {
if (CurTok == '(' && !atCaseBoundary())
return ParseMemberCall(IdName, std::move(Accesses), Line);
- // Degrade rule: shapes that existed before designators keep their nodes.
+ return makeDesignator(IdName, std::move(Accesses), Line);
+}
+
+// Degrade rule: shapes that existed before designators keep their nodes.
+// A bare VariableExprAST carries no line; callers set it when they need one.
+std::unique_ptr<ExprAST> Parser::makeDesignator(
+ const std::string &Name, std::vector<DesignatorAccess> Accesses, int Line) {
if (Accesses.empty())
- return std::make_unique<VariableExprAST>(IdName);
+ return std::make_unique<VariableExprAST>(Name);
if (Accesses.size() == 1 && Accesses[0].Kind == AccessKind::Index)
- return std::make_unique<ArrayAccessExprAST>(IdName, std::move(Accesses[0].Indices), Line);
- return std::make_unique<DesignatorExprAST>(IdName, std::move(Accesses), Line);
+ return std::make_unique<ArrayAccessExprAST>(Name, std::move(Accesses[0].Indices), Line);
+ return std::make_unique<DesignatorExprAST>(Name, std::move(Accesses), Line);
}
// The final field suffix names the method; preceding suffixes form its receiver.