Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit756e208

Browse files
#1893 Fix script ambiguity between functions and pair syntax
1 parentdcbaf27 commit756e208

File tree

12 files changed

+347
-131
lines changed

12 files changed

+347
-131
lines changed

‎distr/flecs.c‎

Lines changed: 109 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4685846860
typedef 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+
8629286330
static
8629386331
const 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;
8673886781
error:
@@ -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:

‎src/addons/parser/parser.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ typedef struct ecs_parser_t {
2020
char*token_keep;
2121
boolsignificant_newline;
2222
boolmerge_variable_members;
23+
boolfunction_token;
2324

2425
ecs_world_t*world;
2526

‎src/addons/parser/tokenizer.c‎

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ const char* flecs_token_kind_str(
8888
return"keyword ";
8989
caseEcsTokIdentifier:
9090
return"identifier ";
91+
caseEcsTokFunction:
92+
return"function ";
9193
caseEcsTokString:
9294
return"string ";
9395
caseEcsTokChar:
@@ -158,6 +160,7 @@ const char* flecs_token_str(
158160
caseEcsTokKeywordTemplate:return"template";
159161
caseEcsTokKeywordModule:return"module";
160162
caseEcsTokIdentifier:return"identifier";
163+
caseEcsTokFunction:return"function";
161164
caseEcsTokString:return"string";
162165
caseEcsTokChar:return"char";
163166
caseEcsTokNumber:return"number";
@@ -306,21 +309,13 @@ const char* flecs_tokenizer_identifier(
306309
}
307310
}while (true);
308311

309-
if (outpos&&parser) {
310-
*outpos='\0';
311-
parser->token_cur=outpos+1;
312-
}
313-
returnpos;
312+
gotodone;
314313
}elseif (c=='>') {
315314
ecs_parser_error(name,code,pos-code,
316315
"> without < in identifier");
317316
returnNULL;
318317
}else {
319-
if (outpos&&parser) {
320-
*outpos='\0';
321-
parser->token_cur=outpos+1;
322-
}
323-
returnpos;
318+
gotodone;
324319
}
325320
}
326321

@@ -331,6 +326,23 @@ const char* flecs_tokenizer_identifier(
331326

332327
pos++;
333328
}while (true);
329+
330+
done:
331+
if (outpos) {
332+
*outpos='\0';
333+
if (parser) {
334+
parser->token_cur=outpos+1;
335+
}
336+
}
337+
338+
if (parser&&parser->function_token) {
339+
if (pos[0]=='(') {
340+
out->kind=EcsTokFunction;
341+
pos++;
342+
}
343+
}
344+
345+
returnpos;
334346
}
335347

336348
// Number token static

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp