Skip to content

Commit fa97fbb

Browse files
committed
support parse for 'test()()' and 'test[]()'
1 parent 56e0a10 commit fa97fbb

6 files changed

Lines changed: 108 additions & 39 deletions

File tree

port/linux/.vscode/launch.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
// "--gtest_filter=parser.split_slice"
2323
// "--gtest_filter=vm.var_global_run"
2424
// "--gtest_filter=lua.eval"
25-
"--gtest_filter=eventloop.once1"
25+
// "--gtest_filter=eventloop.once1"
26+
"--gtest_filter=parser.fn_fn"
27+
// "--gtest_filter=parser.slice_slice"
28+
// "--gtest_filter=parser.page_add"
2629
],
2730
"stopAtEntry": false,
2831
"cwd": "${workspaceFolder}",

src/PikaParser.c

Lines changed: 81 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ char* Cursor_popLastToken(Args* outBuffs, char** pStmt, char* str) {
7373
Arg* poped_arg = arg_newStr("");
7474
Cursor_forEach(cs, stmts) {
7575
Cursor_iterStart(&cs);
76-
if (cs.branket_deepth == 0) {
76+
if (cs.bracket_deepth == 0) {
7777
if (strEqu(str, cs.token1.pyload)) {
7878
divider_index = cs.iter_index;
7979
}
@@ -903,22 +903,22 @@ void Cursor_iterStart(struct Cursor* cs) {
903903
LexToken_update(&cs->token1);
904904
LexToken_update(&cs->token2);
905905
if (strEqu(cs->token1.pyload, "(")) {
906-
cs->branket_deepth++;
906+
cs->bracket_deepth++;
907907
}
908908
if (strEqu(cs->token1.pyload, ")")) {
909-
cs->branket_deepth--;
909+
cs->bracket_deepth--;
910910
}
911911
if (strEqu(cs->token1.pyload, "[")) {
912-
cs->branket_deepth++;
912+
cs->bracket_deepth++;
913913
}
914914
if (strEqu(cs->token1.pyload, "]")) {
915-
cs->branket_deepth--;
915+
cs->bracket_deepth--;
916916
}
917917
if (strEqu(cs->token1.pyload, "{")) {
918-
cs->branket_deepth++;
918+
cs->bracket_deepth++;
919919
}
920920
if (strEqu(cs->token1.pyload, "}")) {
921-
cs->branket_deepth--;
921+
cs->bracket_deepth--;
922922
}
923923
}
924924

@@ -932,7 +932,7 @@ void _Cursor_init(struct Cursor* cs) {
932932
cs->tokenStream = NULL;
933933
cs->length = 0;
934934
cs->iter_index = 0;
935-
cs->branket_deepth = 0;
935+
cs->bracket_deepth = 0;
936936
cs->last_token = NULL;
937937
cs->iter_buffs = NULL;
938938
cs->buffs_p = New_strBuff();
@@ -974,10 +974,36 @@ void _Cursor_beforeIter(struct Cursor* cs) {
974974
cs->last_token = arg_newStr(TokenStream_pop(cs->buffs_p, &cs->tokenStream));
975975
}
976976

977+
uint8_t Token_isBranketStart(LexToken* token) {
978+
if (token->type != TOKEN_devider) {
979+
return PIKA_FALSE;
980+
}
981+
if (strEqu(token->pyload, "(") || strEqu(token->pyload, "[") ||
982+
strEqu(token->pyload, "{")) {
983+
return PIKA_TRUE;
984+
}
985+
return PIKA_FALSE;
986+
}
987+
988+
uint8_t Token_isBranketEnd(LexToken* token) {
989+
if (token->type != TOKEN_devider) {
990+
return PIKA_FALSE;
991+
}
992+
if (strEqu(token->pyload, ")") || strEqu(token->pyload, "]") ||
993+
strEqu(token->pyload, "}")) {
994+
return PIKA_TRUE;
995+
}
996+
return PIKA_FALSE;
997+
}
998+
999+
uint8_t Token_isBranket(LexToken* token) {
1000+
return Token_isBranketStart(token) || Token_isBranketEnd(token);
1001+
}
1002+
9771003
uint8_t _Cursor_count(char* stmt,
9781004
TokenType type,
9791005
char* pyload,
980-
PIKA_BOOL bSkipBranket) {
1006+
PIKA_BOOL bSkipbracket) {
9811007
/* fast return */
9821008
if (!strstr(stmt, pyload)) {
9831009
return PIKA_FALSE;
@@ -987,10 +1013,16 @@ uint8_t _Cursor_count(char* stmt,
9871013
Cursor_forEach(cs, stmt) {
9881014
Cursor_iterStart(&cs);
9891015
if (cs.token1.type == type && (strEqu(cs.token1.pyload, pyload))) {
990-
if (bSkipBranket && cs.branket_deepth > 0) {
991-
/* skip branket */
992-
Cursor_iterEnd(&cs);
993-
continue;
1016+
if (bSkipbracket) {
1017+
uint8_t branket_deepth_check = 0;
1018+
if (Token_isBranketStart(&cs.token1)) {
1019+
branket_deepth_check = 1;
1020+
}
1021+
if (cs.bracket_deepth > branket_deepth_check) {
1022+
/* skip bracket */
1023+
Cursor_iterEnd(&cs);
1024+
continue;
1025+
}
9941026
}
9951027
res++;
9961028
}
@@ -1019,7 +1051,7 @@ char* Cursor_popToken(Args* buffs, char** pStmt, char* devide) {
10191051
Cursor_forEach(cs, *pStmt) {
10201052
Cursor_iterStart(&cs);
10211053
if (!is_find_devide) {
1022-
if ((cs.branket_deepth == 0 && strEqu(cs.token1.pyload, devide)) ||
1054+
if ((cs.bracket_deepth == 0 && strEqu(cs.token1.pyload, devide)) ||
10231055
cs.iter_index == cs.length) {
10241056
is_find_devide = PIKA_TRUE;
10251057
Cursor_iterEnd(&cs);
@@ -1048,14 +1080,14 @@ char* Cursor_popToken(Args* buffs, char** pStmt, char* devide) {
10481080

10491081
char* Cursor_splitCollect(Args* buffs, char* stmt, char* devide, int index) {
10501082
Arg* aOut = arg_newStr("");
1051-
int expect_branket = 0;
1083+
int expect_bracket = 0;
10521084
if (devide[0] == '(' || devide[0] == '[' || devide[0] == '{') {
1053-
expect_branket = 1;
1085+
expect_bracket = 1;
10541086
}
10551087
int i = 0;
10561088
Cursor_forEach(cs, stmt) {
10571089
Cursor_iterStart(&cs);
1058-
if (cs.branket_deepth == expect_branket &&
1090+
if (cs.bracket_deepth == expect_bracket &&
10591091
strEqu(cs.token1.pyload, devide)) {
10601092
i++;
10611093
Cursor_iterEnd(&cs);
@@ -1092,7 +1124,7 @@ static void Slice_getPars(Args* outBuffs,
10921124
uint8_t colon_i = 0;
10931125
Cursor_forEach(cs, inner) {
10941126
Cursor_iterStart(&cs);
1095-
if (strEqu(cs.token1.pyload, ":") && cs.branket_deepth == 0) {
1127+
if (strEqu(cs.token1.pyload, ":") && cs.bracket_deepth == 0) {
10961128
colon_i++;
10971129
goto iter_continue1;
10981130
}
@@ -1251,7 +1283,7 @@ char* Suger_format(Args* outBuffs, char* right) {
12511283
PIKA_BOOL is_format = PIKA_FALSE;
12521284
Cursor_forEach(ps1, right) {
12531285
Cursor_iterStart(&ps1);
1254-
if (ps1.branket_deepth == 0 && strEqu(ps1.token1.pyload, "%")) {
1286+
if (ps1.bracket_deepth == 0 && strEqu(ps1.token1.pyload, "%")) {
12551287
is_format = PIKA_TRUE;
12561288
}
12571289
Cursor_iterEnd(&ps1);
@@ -1452,7 +1484,7 @@ char* Parser_popSubStmt(Args* outbuffs, char** psStmt, char* delimiter) {
14521484
Cursor_iterEnd(&cs);
14531485
continue;
14541486
}
1455-
if (cs.branket_deepth > 0) {
1487+
if (cs.bracket_deepth > 0) {
14561488
/* ignore */
14571489
aSubstmt = arg_strAppend(aSubstmt, cs.token1.pyload);
14581490
Cursor_iterEnd(&cs);
@@ -1485,21 +1517,25 @@ int Parser_getSubStmtNum(char* subStmts, char* delimiter) {
14851517
return _Cursor_count(subStmts, TOKEN_devider, delimiter, PIKA_TRUE);
14861518
}
14871519

1488-
char* Parser_popLastSubStmt(Args* outbuffs, char** stmt_p, char* delimiter) {
1520+
char* _Parser_popLastSubStmt(Args* outbuffs,
1521+
char** stmt_p,
1522+
char* delimiter,
1523+
PIKA_BOOL bSkipBracket) {
14891524
uint8_t last_stmt_i = 0;
14901525
char* stmt = *stmt_p;
14911526
Cursor_forEach(cs, stmt) {
14921527
Cursor_iterStart(&cs);
14931528
if (strIsStartWith(cs.token1.pyload, delimiter)) {
14941529
/* found delimiter */
1495-
if (!strEqu(delimiter, "[") && cs.branket_deepth > 0) {
1496-
/* ignore */
1530+
1531+
if (bSkipBracket && cs.bracket_deepth > 0) {
1532+
/* skip bracket */
14971533
Cursor_iterEnd(&cs);
14981534
continue;
14991535
}
15001536

15011537
/* for "[" */
1502-
if (cs.branket_deepth > 1) {
1538+
if (cs.bracket_deepth > 1) {
15031539
/* ignore */
15041540
Cursor_iterEnd(&cs);
15051541
continue;
@@ -1531,6 +1567,10 @@ char* Parser_popLastSubStmt(Args* outbuffs, char** stmt_p, char* delimiter) {
15311567
return strsCacheArg(outbuffs, lastStmt);
15321568
}
15331569

1570+
char* Parser_popLastSubStmt(Args* outbuffs, char** stmt_p, char* delimiter) {
1571+
return _Parser_popLastSubStmt(outbuffs, stmt_p, delimiter, PIKA_TRUE);
1572+
}
1573+
15341574
static void _AST_parse_list(AST* ast, Args* buffs, char* stmt) {
15351575
#if !PIKA_BUILTIN_STRUCT_ENABLE
15361576
return;
@@ -1573,7 +1613,7 @@ static void _AST_parse_slice(AST* ast, Args* buffs, char* stmt) {
15731613
#endif
15741614
AST_setNodeAttr(ast, (char*)"slice", "slice");
15751615
stmt = strsCopy(buffs, stmt);
1576-
char* laststmt = Parser_popLastSubStmt(buffs, &stmt, "[");
1616+
char* laststmt = _Parser_popLastSubStmt(buffs, &stmt, "[", PIKA_FALSE);
15771617
AST_parseSubStmt(ast, stmt);
15781618
char* slice_list = strsCut(buffs, laststmt, '[', ']');
15791619
pika_assert(slice_list != NULL);
@@ -1775,8 +1815,16 @@ AST* AST_parseStmt(AST* ast, char* stmt) {
17751815
/* solve method stmt */
17761816
if (STMT_method == stmtType) {
17771817
char* sRealType = "method";
1778-
sMethod = strsGetFirstToken(&buffs, right, '(');
1779-
char* sSubStmts = strsCut(&buffs, right, '(', ')');
1818+
char* methodstmt = strsCopy(&buffs, right);
1819+
char* laststmt = methodstmt;
1820+
/* for method()() */
1821+
if (_Cursor_count(methodstmt, TOKEN_devider, "(", PIKA_TRUE) > 1) {
1822+
laststmt =
1823+
_Parser_popLastSubStmt(&buffs, &methodstmt, "(", PIKA_FALSE);
1824+
AST_parseSubStmt(ast, methodstmt);
1825+
}
1826+
sMethod = strsGetFirstToken(&buffs, laststmt, '(');
1827+
char* sSubStmts = strsCut(&buffs, laststmt, '(', ')');
17801828
if (NULL == sSubStmts) {
17811829
result = PIKA_RES_ERR_SYNTAX_ERROR;
17821830
goto __exit;
@@ -1975,7 +2023,7 @@ static char* Suger_multiReturn(Args* out_buffs, char* line) {
19752023
#endif
19762024
Cursor_forEach(cs, line) {
19772025
Cursor_iterStart(&cs);
1978-
if (cs.branket_deepth == 0 && strEqu(cs.token1.pyload, ",")) {
2026+
if (cs.bracket_deepth == 0 && strEqu(cs.token1.pyload, ",")) {
19792027
line = strsFormat(out_buffs, strGetSize(line) + 3, "(%s)", line);
19802028
Cursor_iterEnd(&cs);
19812029
break;
@@ -2307,7 +2355,7 @@ static PIKA_BOOL _check_is_multi_assign(char* arg_list) {
23072355
PIKA_BOOL res = PIKA_FALSE;
23082356
Cursor_forEach(cs, arg_list) {
23092357
Cursor_iterStart(&cs);
2310-
if ((cs.branket_deepth == 0 && strEqu(cs.token1.pyload, ","))) {
2358+
if ((cs.bracket_deepth == 0 && strEqu(cs.token1.pyload, ","))) {
23112359
res = PIKA_TRUE;
23122360
}
23132361
Cursor_iterEnd(&cs);
@@ -2333,7 +2381,7 @@ static char* Suger_multiAssign(Args* out_buffs, char* line) {
23332381
int out_num = 0;
23342382
Cursor_forEach(cs, line) {
23352383
Cursor_iterStart(&cs);
2336-
if (cs.branket_deepth == 0 && strEqu(cs.token1.pyload, "=")) {
2384+
if (cs.bracket_deepth == 0 && strEqu(cs.token1.pyload, "=")) {
23372385
is_assign = PIKA_TRUE;
23382386
Cursor_iterEnd(&cs);
23392387
continue;
@@ -2732,15 +2780,15 @@ char* parser_lines2BackendCode(Parser* self, char* sPyLines) {
27322780
Cursor_deinit(&c);
27332781
/* auto connection */
27342782
if (uLinesIndex < uLinesNum) {
2735-
if (c.branket_deepth > 0) {
2783+
if (c.bracket_deepth > 0) {
27362784
aLineConnection = arg_strAppend(aLineConnection, sLine);
27372785
bIsLineConnection = 1;
27382786
goto next_line;
27392787
}
27402788
}
27412789

2742-
/* branket match failed */
2743-
if (c.branket_deepth != 0) {
2790+
/* bracket match failed */
2791+
if (c.bracket_deepth != 0) {
27442792
sBackendCode = NULL;
27452793
goto parse_after;
27462794
}

src/PikaParser.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ struct Cursor {
112112
char* tokenStream;
113113
uint16_t length;
114114
uint16_t iter_index;
115-
int8_t branket_deepth;
115+
int8_t bracket_deepth;
116116
struct LexToken token1;
117117
struct LexToken token2;
118118
Arg* last_token;
@@ -148,7 +148,7 @@ uint8_t Cursor_count(char* stmt, TokenType type, char* pyload);
148148
uint8_t _Cursor_count(char* stmt,
149149
TokenType type,
150150
char* pyload,
151-
PIKA_BOOL bSkipBranket);
151+
PIKA_BOOL bSkipbracket);
152152

153153
AST* AST_parseStmt(AST* ast, char* stmt);
154154
char* AST_genAsm(AST* oAST, Args* outBuffs);

test/VM-test.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2869,6 +2869,8 @@ TEST_RUN_LINES(vm,
28692869

28702870
TEST_RUN_LINES(vm, import_void, "import \n")
28712871

2872+
TEST_RUN_SINGLE_FILE(vm, fn_fn, "test/python/builtin/fn_fn.py")
2873+
28722874
#endif
28732875

28742876
TEST_END

test/parse-test.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3572,7 +3572,7 @@ TEST(parser, num_issue) {
35723572
}
35733573

35743574
#if PIKA_SYNTAX_SLICE_ENABLE
3575-
TEST(parser, branket_issue2) {
3575+
TEST(parser, bracket_issue2) {
35763576
g_PikaMemInfo.heapUsedMax = 0;
35773577
Args* buffs = New_strBuff();
35783578
char* lines = "temp = hex(int('12'))[0:2]\n";
@@ -3595,7 +3595,7 @@ TEST(parser, branket_issue2) {
35953595
#endif
35963596

35973597
#if PIKA_SYNTAX_SLICE_ENABLE
3598-
TEST(parser, branket_issue3) {
3598+
TEST(parser, bracket_issue3) {
35993599
g_PikaMemInfo.heapUsedMax = 0;
36003600
Args* buffs = New_strBuff();
36013601
char* lines = "a = b[x][y]\n";
@@ -3617,7 +3617,7 @@ TEST(parser, branket_issue3) {
36173617
#endif
36183618

36193619
#if PIKA_SYNTAX_SLICE_ENABLE
3620-
TEST(parser, branket_issue4) {
3620+
TEST(parser, bracket_issue4) {
36213621
g_PikaMemInfo.heapUsedMax = 0;
36223622
Args* buffs = New_strBuff();
36233623
char* lines = "a = b[c[y]]\n";
@@ -5648,6 +5648,10 @@ TEST_LINES2ASM(split_slice,
56485648

56495649
TEST_LINES2ASM(val_hint, "a:int", "B0\nB0\n")
56505650

5651+
TEST_LINES2ASM_NOCHECK(fn_fn, "test()()")
5652+
5653+
TEST_LINES2ASM_NOCHECK(slice_slice, "test[1][2][3]")
5654+
56515655
#endif
56525656

56535657
TEST_END

test/python/builtin/fn_fn.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
3+
def test1():
4+
print("test1")
5+
6+
def test():
7+
return test1
8+
9+
l = [test1]
10+
11+
l[0]()
12+
test()()

0 commit comments

Comments
 (0)