parser: method call in expr

This commit is contained in:
2026-04-27 16:20:16 +02:00
parent ab1b9d7963
commit 146b524587
3 changed files with 59 additions and 3 deletions

View File

@@ -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");

View File

@@ -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 {

View File

@@ -25,6 +25,7 @@ typedef enum noomP_NodeType {
NOOMP_NODE_GETFIELD,
NOOMP_NODE_INDEX,
NOOMP_NODE_CALL,
NOOMP_NODE_METHODCALL,
NOOMP_NODE_FIELDNAME,