From 1b524f75401a6318fbaf3fee0bfcbe59348f2e51 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Mon, 2 Feb 2026 10:08:22 +0000 Subject: Added STRING --- lib/Parser/Parser.cc | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'lib/Parser') diff --git a/lib/Parser/Parser.cc b/lib/Parser/Parser.cc index c5e91f9..236aa01 100644 --- a/lib/Parser/Parser.cc +++ b/lib/Parser/Parser.cc @@ -95,6 +95,34 @@ std::unique_ptr Parser::ParseIdentifierExpr() { return std::make_unique(IdName); } +std::unique_ptr Parser::ParseStringBuiltin(const std::string &FuncName) { + getNextToken(); + if (CurTok != '(') { + fprintf(stderr, "Error: Expected '(' after %s\n", FuncName.c_str()); + return nullptr; + } + 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 %s\n", FuncName.c_str()); + return nullptr; + } + getNextToken(); + } + } + getNextToken(); + return std::make_unique(FuncName, std::move(Args)); +} + std::unique_ptr Parser::ParseParenExpr() { getNextToken(); auto V = ParseExpression(); @@ -112,6 +140,17 @@ std::unique_ptr Parser::ParsePrimary() { case tok_identifier: return ParseIdentifierExpr(); case tok_number_int: return ParseNumberExpr(); case tok_number_real: return ParseNumberExpr(); + case tok_string_literal: { + auto Res = std::make_unique(Lex.StringVal); + getNextToken(); + return Res; + } + case tok_length: return ParseStringBuiltin("LENGTH"); + case tok_mid: return ParseStringBuiltin("MID"); + case tok_right: return ParseStringBuiltin("RIGHT"); + case tok_lcase: return ParseStringBuiltin("LCASE"); + case tok_ucase: return ParseStringBuiltin("UCASE"); + case tok_true: { getNextToken(); return std::make_unique(true); @@ -241,6 +280,7 @@ std::unique_ptr Parser::ParseDeclare() { if (CurTok == tok_integer_kw) TypeStr = "INTEGER"; else if (CurTok == tok_real_kw) TypeStr = "REAL"; else if (CurTok == tok_boolean_kw) TypeStr = "BOOLEAN"; + else if (CurTok == tok_string_kw) TypeStr = "STRING"; else { fprintf(stderr, "Error: Unknown type in declaration\n"); return nullptr; -- cgit v1.3.1-4-g156e