From 146b524587e2cb94caba9937f2068f245a880cee Mon Sep 17 00:00:00 2001 From: Blendi Date: Mon, 27 Apr 2026 16:20:16 +0200 Subject: [PATCH] parser: method call in expr --- src/main.c | 2 +- src/parser.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-- src/parser.h | 1 + 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index 679778a..2da24cd 100644 --- a/src/main.c +++ b/src/main.c @@ -33,7 +33,7 @@ void print_node(noomP_Node* node, noom_uint_t depth) { int main(int argc, char** argv) { // uhh uhhh uhhhhh - const char* code = "local a = a.b[\"hi\"](5, 2)"; + const char* code = "local a = a().a:temp(2,5)"; noom_uint_t pos = 0; printf("LEX OUTPUT:\n"); diff --git a/src/parser.c b/src/parser.c index 71f64f2..54f7950 100644 --- a/src/parser.c +++ b/src/parser.c @@ -37,6 +37,8 @@ const char *noomP_formatNodeType(noomP_NodeType node_type) { return "index"; case NOOMP_NODE_CALL: return "call"; + case NOOMP_NODE_METHODCALL: + return "method call"; case NOOMP_NODE_FIELDNAME: return "fieldname"; default: @@ -191,8 +193,61 @@ noomP_Node* noomP_parseComplexExpression(noomP_Parser* parser, noomP_Node* snode noomP_skip(parser, &token); node = new; - - } else { // TODO: method call + } else if (noom_streql(parser->code + token.offset, token.length, ":", 1)) { // method call + noomP_skip(parser, &token); + noom_uint_t sym_loc = token.offset; + + noomP_peek(parser, &token); // get method name + noom_uint_t method = token.offset; + noomP_skip(parser, &token); + + noomP_Node* new = noomP_allocNode(parser); + if (new == 0) return 0; + + new->type = NOOMP_NODE_METHODCALL; + new->source_offset = sym_loc; + + noomP_Node* method_node = noomP_allocNode(parser); + if (method_node == 0) return 0; + + method_node->type = NOOMP_NODE_FIELDNAME; + method_node->source_offset = method; + + noomP_addSubnode(new, node); + noomP_addSubnode(new, method_node); + + noomP_peek(parser, &token); + if (token.type != NOOML_TOKEN_SYMBOL || (!noom_streql(parser->code + token.offset, token.length, "(", 1))) { + return 0; + } + noomP_skip(parser, &token); + + noomP_peek(parser, &token); + if (token.type != NOOML_TOKEN_SYMBOL || (!noom_streql(parser->code + token.offset, token.length, ")", 1))) { + while (1) { + noomP_Node* expr = noomP_parseExpression(parser); + if (expr == 0) return 0; + + noomP_addSubnode(new, expr); + + noomP_peek(parser, &token); + if (token.type != NOOML_TOKEN_SYMBOL || (!noom_streql(parser->code + token.offset, token.length, ",", 1))) { + break; + } + noomP_skip(parser, &token); + } + } + + // check for ) + noomP_peek(parser, &token); + if (token.type != NOOML_TOKEN_SYMBOL || (!noom_streql(parser->code + token.offset, token.length, ")", 1))) { + return 0; + } + + noomP_skip(parser, &token); + + node = new; + } else { return node; // done } } else { diff --git a/src/parser.h b/src/parser.h index e52b8d5..0fcd098 100644 --- a/src/parser.h +++ b/src/parser.h @@ -25,6 +25,7 @@ typedef enum noomP_NodeType { NOOMP_NODE_GETFIELD, NOOMP_NODE_INDEX, NOOMP_NODE_CALL, + NOOMP_NODE_METHODCALL, NOOMP_NODE_FIELDNAME,