diff options
| -rw-r--r-- | include/cps/Parser.h | 2 | ||||
| -rw-r--r-- | lib/Parser/Parser.cc | 8 | ||||
| -rw-r--r-- | lib/Parser/ParserExpression.cc | 14 |
3 files changed, 13 insertions, 11 deletions
diff --git a/include/cps/Parser.h b/include/cps/Parser.h index cf27234..c9fe186 100644 --- a/include/cps/Parser.h +++ b/include/cps/Parser.h @@ -78,6 +78,8 @@ class Parser { std::unique_ptr<StmtAST> ParseConstant(); std::unique_ptr<StmtAST> ParseAssignStmt(); bool ParseDesignatorSuffix(std::vector<DesignatorAccess> &Out); + static std::unique_ptr<ExprAST> makeDesignator( + const std::string &Name, std::vector<DesignatorAccess> Accesses, int Line); std::unique_ptr<StmtAST> ParseTypeDecl(); std::unique_ptr<StmtAST> ParseTemplateDecl(); diff --git a/lib/Parser/Parser.cc b/lib/Parser/Parser.cc index 37fe8ec..d17856b 100644 --- a/lib/Parser/Parser.cc +++ b/lib/Parser/Parser.cc @@ -271,13 +271,7 @@ std::unique_ptr<StmtAST> Parser::ParseInputStmt() { getNextToken(); std::vector<DesignatorAccess> Accesses; if (!ParseDesignatorSuffix(Accesses)) return nullptr; - std::unique_ptr<ExprAST> Target; - if (Accesses.empty()) - Target = std::make_unique<VariableExprAST>(Name); - else if (Accesses.size() == 1 && Accesses[0].Kind == AccessKind::Index) - Target = std::make_unique<ArrayAccessExprAST>(Name, std::move(Accesses[0].Indices), Line); - else - Target = std::make_unique<DesignatorExprAST>(Name, std::move(Accesses), Line); + auto Target = makeDesignator(Name, std::move(Accesses), Line); Target->setLine(Line); return std::make_unique<InputStmtAST>(std::move(Target)); } 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. |
