diff options
Diffstat (limited to 'lib/Parser/ParserExpression.cc')
| -rw-r--r-- | lib/Parser/ParserExpression.cc | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/lib/Parser/ParserExpression.cc b/lib/Parser/ParserExpression.cc index b8952a8..e9b0dcc 100644 --- a/lib/Parser/ParserExpression.cc +++ b/lib/Parser/ParserExpression.cc @@ -59,6 +59,9 @@ std::unique_ptr<ExprAST> Parser::ParseIdentifierExpr() { std::vector<DesignatorAccess> Accesses; if (!ParseDesignatorSuffix(Accesses)) return nullptr; + if (CurTok == '(' && !atCaseBoundary()) + return ParseMemberCall(IdName, std::move(Accesses), Line); + // Degrade rule: shapes that existed before designators keep their nodes. if (Accesses.empty()) return std::make_unique<VariableExprAST>(IdName); @@ -67,6 +70,31 @@ std::unique_ptr<ExprAST> Parser::ParseIdentifierExpr() { return std::make_unique<DesignatorExprAST>(IdName, std::move(Accesses), Line); } +// The final field suffix names the method; preceding suffixes form its receiver. +std::unique_ptr<MemberCallExprAST> Parser::ParseMemberCall( + const std::string &Name, std::vector<DesignatorAccess> Accesses, int Line) { + if (Accesses.empty() || Accesses.back().Kind != AccessKind::Field) { + fprintf(stderr, "error: Expected a method name after '.' at line %d\n", Line); + return nullptr; + } + std::string Method = Accesses.back().FieldName; + Accesses.pop_back(); + auto Receiver = std::make_unique<DesignatorExprAST>(Name, std::move(Accesses), Line); + std::vector<std::unique_ptr<ExprAST>> Args; + if (CurTok == '(') { + getNextToken(); + auto Parsed = ParseExprList(')', true); + if (!Parsed) return nullptr; + Args = std::move(*Parsed); + } + if (CurTok == '[' || CurTok == '.' || CurTok == '^') { + fprintf(stderr, "error: record/array/pointer access on a function result is not supported at line %d\n", + Lex.getLine()); + return nullptr; + } + return std::make_unique<MemberCallExprAST>(std::move(Receiver), Method, std::move(Args), Line); +} + // Postfix accessor chain after an identifier: '[' exprs ']' | '.' IDENT | '^' bool Parser::ParseDesignatorSuffix(std::vector<DesignatorAccess> &Out) { while (true) { |
