From bd799e42b40613983c6e3cb9aedf58866ac68605 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Fri, 30 Jan 2026 13:11:20 +0000 Subject: Added FUNCTION and PROCEDURE --- lib/Parser/Parser.cc | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) (limited to 'lib/Parser/Parser.cc') diff --git a/lib/Parser/Parser.cc b/lib/Parser/Parser.cc index b9396ce..563dd9b 100644 --- a/lib/Parser/Parser.cc +++ b/lib/Parser/Parser.cc @@ -1,4 +1,5 @@ #include "cps/Parser.h" +#include "cps/FunctionAST.h" using namespace cps; @@ -40,24 +41,40 @@ std::unique_ptr Parser::ParseIdentifierExpr() { std::string IdName = Lex.IdentifierStr; int Line = Lex.getLine(); getNextToken(); + + if (CurTok == '(') { + getNextToken(); + std::vector> Args; + if (CurTok != ')') { + while (true) { + if (auto Arg = ParseExpression()) + Args.push_back(std::move(Arg)); + else + return nullptr; + + if (CurTok == ')') break; + + if (CurTok != ',') { + fprintf(stderr, "Error: Expected ')' or ',' in function call.\n"); + return nullptr; + } + getNextToken(); + } + } + getNextToken(); + return std::make_unique(IdName, std::move(Args)); + } if (CurTok == '[') { getNextToken(); std::vector> Indices; - while (true) { auto Exp = ParseExpression(); if (!Exp) return nullptr; Indices.push_back(std::move(Exp)); - - if (CurTok == ']') { - break; - } - if (CurTok == ',') { - getNextToken(); - continue; - } - fprintf(stderr, "Error: Expected ',' or ']' in array index\n"); + if (CurTok == ']') break; + if (CurTok == ',') { getNextToken(); continue; } + fprintf(stderr, "Error: Expected ',' or ']'\n"); return nullptr; } getNextToken(); @@ -407,6 +424,18 @@ std::unique_ptr Parser::ParseStatement() { else if (CurTok == tok_for) { return ParseForStmt(); } + else if (CurTok == tok_function) { + return ParseFunction(); + } + else if (CurTok == tok_procedure) { + return ParseProcedure(); + } + else if (CurTok == tok_call) { + return ParseCallStmt(); + } + else if (CurTok == tok_return) { + return ParseReturnStmt(); + } return nullptr; } -- cgit v1.3.1-4-g156e