@@ -46775,6 +46775,7 @@ typedef struct ecs_parser_t {
4677546775 char *token_keep;
4677646776 bool significant_newline;
4677746777 bool merge_variable_members;
46778+ bool function_token;
4677846779
4677946780 ecs_world_t *world;
4678046781
@@ -46836,23 +46837,24 @@ typedef enum ecs_token_kind_t {
4683646837 EcsTokShiftLeft = 110,
4683746838 EcsTokShiftRight = 111,
4683846839 EcsTokIdentifier = 112,
46839- EcsTokString = 113,
46840- EcsTokNumber = 114,
46841- EcsTokKeywordModule = 115,
46842- EcsTokKeywordUsing = 116,
46843- EcsTokKeywordWith = 117,
46844- EcsTokKeywordIf = 118,
46845- EcsTokKeywordFor = 119,
46846- EcsTokKeywordIn = 120,
46847- EcsTokKeywordElse = 121,
46848- EcsTokKeywordTemplate = 122,
46849- EcsTokKeywordProp = 130,
46850- EcsTokKeywordConst = 131,
46851- EcsTokKeywordMatch = 132,
46852- EcsTokKeywordNew = 133,
46853- EcsTokKeywordExport = 134,
46854- EcsTokAddAssign = 135,
46855- EcsTokMulAssign = 136,
46840+ EcsTokFunction = 113,
46841+ EcsTokString = 114,
46842+ EcsTokNumber = 115,
46843+ EcsTokKeywordModule = 116,
46844+ EcsTokKeywordUsing = 117,
46845+ EcsTokKeywordWith = 118,
46846+ EcsTokKeywordIf = 119,
46847+ EcsTokKeywordFor = 120,
46848+ EcsTokKeywordIn = 121,
46849+ EcsTokKeywordElse = 122,
46850+ EcsTokKeywordTemplate = 130,
46851+ EcsTokKeywordProp = 131,
46852+ EcsTokKeywordConst = 132,
46853+ EcsTokKeywordMatch = 133,
46854+ EcsTokKeywordNew = 134,
46855+ EcsTokKeywordExport = 135,
46856+ EcsTokAddAssign = 136,
46857+ EcsTokMulAssign = 137,
4685646858} ecs_token_kind_t;
4685746859
4685846860typedef struct ecs_token_t {
@@ -58063,6 +58065,8 @@ const char* flecs_token_kind_str(
5806358065 return "keyword ";
5806458066 case EcsTokIdentifier:
5806558067 return "identifier ";
58068+ case EcsTokFunction:
58069+ return "function ";
5806658070 case EcsTokString:
5806758071 return "string ";
5806858072 case EcsTokChar:
@@ -58133,6 +58137,7 @@ const char* flecs_token_str(
5813358137 case EcsTokKeywordTemplate: return "template";
5813458138 case EcsTokKeywordModule: return "module";
5813558139 case EcsTokIdentifier: return "identifier";
58140+ case EcsTokFunction: return "function";
5813658141 case EcsTokString: return "string";
5813758142 case EcsTokChar: return "char";
5813858143 case EcsTokNumber: return "number";
@@ -58281,21 +58286,13 @@ const char* flecs_tokenizer_identifier(
5828158286 }
5828258287 } while (true);
5828358288
58284- if (outpos && parser) {
58285- *outpos = '\0';
58286- parser->token_cur = outpos + 1;
58287- }
58288- return pos;
58289+ goto done;
5828958290 } else if (c == '>') {
5829058291 ecs_parser_error(name, code, pos - code,
5829158292 "> without < in identifier");
5829258293 return NULL;
5829358294 } else {
58294- if (outpos && parser) {
58295- *outpos = '\0';
58296- parser->token_cur = outpos + 1;
58297- }
58298- return pos;
58295+ goto done;
5829958296 }
5830058297 }
5830158298
@@ -58306,6 +58303,23 @@ const char* flecs_tokenizer_identifier(
5830658303
5830758304 pos ++;
5830858305 } while (true);
58306+
58307+ done:
58308+ if (outpos) {
58309+ *outpos = '\0';
58310+ if (parser) {
58311+ parser->token_cur = outpos + 1;
58312+ }
58313+ }
58314+
58315+ if (parser && parser->function_token) {
58316+ if (pos[0] == '(') {
58317+ out->kind = EcsTokFunction;
58318+ pos ++;
58319+ }
58320+ }
58321+
58322+ return pos;
5830958323}
5831058324
5831158325// Number token static
@@ -63122,10 +63136,6 @@ paren: {
6312263136 )
6312363137 )
6312463138 )
63125- // // (Likes, Apples)
63126- // Parse_4(EcsTokIdentifier, ',', EcsTokIdentifier, ')',
63127- // goto pair;
63128- // )
6312963139}
6313063140
6313163141// (Likes, Apples)
@@ -86289,6 +86299,34 @@ const char* flecs_script_parse_collection_initializer(
8628986299 ParserEnd;
8629086300}
8629186301
86302+ static
86303+ const char* flecs_script_parse_function(
86304+ ecs_parser_t *parser,
86305+ const char *pos,
86306+ ecs_expr_node_t **out)
86307+ {
86308+ ecs_expr_function_t *result = flecs_expr_function(parser);
86309+ result->left = *out;
86310+
86311+ pos = flecs_script_parse_initializer(
86312+ parser, pos, ')', &result->args);
86313+ if (!pos) {
86314+ goto error;
86315+ }
86316+
86317+ *out = (ecs_expr_node_t*)result;
86318+
86319+ if (pos[0] != ')') {
86320+ Error("expected end of argument list");
86321+ }
86322+
86323+ pos ++;
86324+
86325+ return pos;
86326+ error:
86327+ return NULL;
86328+ }
86329+
8629286330static
8629386331const char* flecs_script_parse_rhs(
8629486332 ecs_parser_t *parser,
@@ -86331,7 +86369,6 @@ const char* flecs_script_parse_rhs(
8633186369 case EcsTokShiftRight:
8633286370 case EcsTokBracketOpen:
8633386371 case EcsTokMember:
86334- case EcsTokParenOpen:
8633586372 {
8633686373 ecs_token_kind_t oper = lookahead_token.kind;
8633786374
@@ -86364,34 +86401,25 @@ const char* flecs_script_parse_rhs(
8636486401 }
8636586402
8636686403 case EcsTokMember: {
86367- Parse_1(EcsTokIdentifier, {
86368- ecs_expr_member_t *result = flecs_expr_member(parser);
86369- result->left = *out;
86370- result->member_name = Token(1);
86371- *out = (ecs_expr_node_t*)result;
86372- break;
86373- });
86374-
86375- break;
86376- }
86377-
86378- case EcsTokParenOpen: {
86379- ecs_expr_function_t *result = flecs_expr_function(parser);
86380- result->left = *out;
86381-
86382- pos = flecs_script_parse_initializer(
86383- parser, pos, ')', &result->args);
86384- if (!pos) {
86385- goto error;
86386- }
86387-
86388- *out = (ecs_expr_node_t*)result;
86404+ Parse(
86405+ case EcsTokFunction:
86406+ case EcsTokIdentifier: {
86407+ ecs_expr_member_t *result = flecs_expr_member(parser);
86408+ result->left = *out;
86409+ result->member_name = Token(1);
86410+ *out = (ecs_expr_node_t*)result;
86411+
86412+ if(t->kind == EcsTokFunction) {
86413+ pos = flecs_script_parse_function(parser, pos, out);
86414+ if (!pos) {
86415+ goto error;
86416+ }
86417+ }
8638986418
86390- if (pos[0] != ')') {
86391- Error("expected end of argument list");
86392- }
86419+ break;
86420+ }
86421+ );
8639386422
86394- pos ++;
8639586423 break;
8639686424 }
8639786425
@@ -86480,7 +86508,8 @@ const char* flecs_script_parse_lhs(
8648086508 break;
8648186509 }
8648286510
86483- case EcsTokIdentifier: {
86511+ case EcsTokIdentifier:
86512+ case EcsTokFunction: {
8648486513 const char *expr = Token(0);
8648586514 if (expr[0] == '$') {
8648686515 *out = (ecs_expr_node_t*)flecs_expr_variable(parser, &expr[1]);
@@ -86502,6 +86531,14 @@ const char* flecs_script_parse_lhs(
8650286531 *out = (ecs_expr_node_t*)flecs_expr_identifier(parser, expr);
8650386532 }
8650486533 }
86534+
86535+ if(t->kind == EcsTokFunction) {
86536+ pos = flecs_script_parse_function(parser, pos, out);
86537+ if (!pos) {
86538+ goto error;
86539+ }
86540+ }
86541+
8650586542 break;
8650686543 }
8650786544
@@ -86569,10 +86606,13 @@ const char* flecs_script_parse_lhs(
8656986606
8657086607 int32_t stmt_count = ecs_vec_count(&parser->scope->stmts);
8657186608
86609+ bool old_function_token = parser->function_token;
86610+ parser->function_token = false;
8657286611 pos = flecs_script_stmt(parser, pos);
8657386612 if (!pos) {
8657486613 goto error;
8657586614 }
86615+ parser->function_token = old_function_token;
8657686616
8657786617 pos = flecs_parse_ws_eol(pos);
8657886618
@@ -86675,8 +86715,10 @@ const char* flecs_script_parse_expr(
8667586715{
8667686716 ParserBegin;
8667786717
86718+ bool old_function_token = parser->function_token;
86719+ parser->function_token = true;
8667886720 pos = flecs_script_parse_lhs(parser, pos, tokenizer, left_oper, out);
86679-
86721+ parser->function_token = old_function_token;
8668086722 EndOfRule;
8668186723
8668286724 ParserEnd;
@@ -86704,7 +86746,8 @@ ecs_script_t* ecs_expr_parse(
8670486746 .code = script->code,
8670586747 .script = impl,
8670686748 .scope = impl->root,
86707- .significant_newline = false
86749+ .significant_newline = false,
86750+ .function_token = true
8670886751 };
8670986752
8671086753 impl->token_buffer_size = ecs_os_strlen(expr) * 2 + 1;
@@ -86724,15 +86767,15 @@ ecs_script_t* ecs_expr_parse(
8672486767 goto error;
8672586768 }
8672686769
86727- //printf("%s\n", ecs_script_ast_to_str(script, true));
86770+ // printf("%s\n", ecs_script_ast_to_str(script, true));
8672886771
8672986772 if (!desc || !desc->disable_folding) {
8673086773 if (flecs_expr_visit_fold(script, &impl->expr, &priv_desc)) {
8673186774 goto error;
8673286775 }
8673386776 }
8673486777
86735- //printf("%s\n", ecs_script_ast_to_str(script, true));
86778+ // printf("%s\n", ecs_script_ast_to_str(script, true));
8673686779
8673786780 return script;
8673886781error:
@@ -87271,6 +87314,7 @@ int flecs_value_binary(
8727187314 case EcsTokMatch:
8727287315 case EcsTokRange:
8727387316 case EcsTokIdentifier:
87317+ case EcsTokFunction:
8727487318 case EcsTokString:
8727587319 case EcsTokChar:
8727687320 case EcsTokNumber:
@@ -90120,6 +90164,7 @@ bool flecs_expr_oper_valid_for_type(
9012090164 case EcsTokMatch:
9012190165 case EcsTokRange:
9012290166 case EcsTokIdentifier:
90167+ case EcsTokFunction:
9012390168 case EcsTokChar:
9012490169 case EcsTokString:
9012590170 case EcsTokNumber:
@@ -90232,6 +90277,7 @@ int flecs_expr_type_for_operator(
9023290277 case EcsTokMatch:
9023390278 case EcsTokRange:
9023490279 case EcsTokIdentifier:
90280+ case EcsTokFunction:
9023590281 case EcsTokChar:
9023690282 case EcsTokString:
9023790283 case EcsTokNumber: