Skip to content

Commit be07caa

Browse files
committed
format
format parser format parser and support 'in' for string
1 parent 2c1b927 commit be07caa

6 files changed

Lines changed: 595 additions & 566 deletions

File tree

port/linux/test/VM-test.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,3 +1090,18 @@ TEST(VM, is) {
10901090
obj_deinit(self);
10911091
EXPECT_EQ(pikaMemNow(), 0);
10921092
}
1093+
1094+
TEST(VM, in) {
1095+
char* line =
1096+
"res1 = 'a' in 'aaa'\n"
1097+
"res2 = 'aaa' in 'a'\n";
1098+
PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
1099+
obj_run(self, line);
1100+
/* collect */
1101+
/* assert */
1102+
EXPECT_EQ(obj_getInt(self, "res1"), 1);
1103+
EXPECT_EQ(obj_getInt(self, "res2"), 0);
1104+
/* deinit */
1105+
obj_deinit(self);
1106+
EXPECT_EQ(pikaMemNow(), 0);
1107+
}

port/linux/test/parse-test.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3610,4 +3610,44 @@ TEST(parser, _is) {
36103610
"0 OPT is \n");
36113611
args_deinit(buffs);
36123612
EXPECT_EQ(pikaMemNow(), 0);
3613+
}
3614+
3615+
TEST(parser, _in) {
3616+
pikaMemInfo.heapUsedMax = 0;
3617+
Args* buffs = New_strBuff();
3618+
char* lines = "a in b\n";
3619+
__platform_printf("%s\n", lines);
3620+
char* pikaAsm = Parser_multiLineToAsm(buffs, lines);
3621+
__platform_printf("%s", pikaAsm);
3622+
EXPECT_STREQ(pikaAsm,
3623+
"B0\n"
3624+
"1 REF a\n"
3625+
"1 REF b\n"
3626+
"0 OPT in \n");
3627+
args_deinit(buffs);
3628+
EXPECT_EQ(pikaMemNow(), 0);
3629+
}
3630+
3631+
TEST(parser, _in2) {
3632+
pikaMemInfo.heapUsedMax = 0;
3633+
Args* buffs = New_strBuff();
3634+
char* lines =
3635+
"res1 = 'a' in 'aaa'\n"
3636+
"res2 = 'aaa' in 'a'\n";
3637+
__platform_printf("%s\n", lines);
3638+
char* pikaAsm = Parser_multiLineToAsm(buffs, lines);
3639+
__platform_printf("%s", pikaAsm);
3640+
EXPECT_STREQ(pikaAsm,
3641+
"B0\n"
3642+
"1 STR a\n"
3643+
"1 STR aaa\n"
3644+
"0 OPT in \n"
3645+
"0 OUT res1\n"
3646+
"B0\n"
3647+
"1 STR aaa\n"
3648+
"1 STR a\n"
3649+
"0 OPT in \n"
3650+
"0 OUT res2\n");
3651+
args_deinit(buffs);
3652+
EXPECT_EQ(pikaMemNow(), 0);
36133653
}

src/PikaParser.c

Lines changed: 92 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -50,74 +50,6 @@ void ParserState_iterStart(struct ParserState* ps);
5050
void ParserState_iterEnd(struct ParserState* ps);
5151
char* Parser_popToken(Args* buffs_p, char* tokens);
5252

53-
/* Syntex item */
54-
const SyntaxItem syntexItemList[] = {
55-
/* clang-format off */
56-
{
57-
.asmCode = "RUN",
58-
.astNodeName = "method",
59-
.isUseNodeValue = PIKA_TRUE
60-
},
61-
{
62-
.asmCode = "OPT",
63-
.astNodeName = "operator",
64-
.isUseNodeValue = PIKA_TRUE
65-
},
66-
{
67-
.asmCode = "BYT",
68-
.astNodeName = "bytes",
69-
.isUseNodeValue = PIKA_TRUE
70-
},
71-
{
72-
.asmCode = "NUM",
73-
.astNodeName = "num",
74-
.isUseNodeValue = PIKA_TRUE
75-
},
76-
{
77-
.asmCode = "IMP",
78-
.astNodeName = "import",
79-
.isUseNodeValue = PIKA_TRUE
80-
},
81-
{
82-
.asmCode = "REF",
83-
.astNodeName = "ref",
84-
.isUseNodeValue = PIKA_TRUE
85-
},
86-
{
87-
.asmCode = "STR",
88-
.astNodeName = "string",
89-
.isUseNodeValue = PIKA_TRUE
90-
},
91-
92-
#if PIKA_SYNTAX_SLICE_ENABLE
93-
{
94-
.asmCode = "SLC",
95-
.astNodeName = "slice",
96-
.isUseNodeValue = PIKA_FALSE
97-
},
98-
#endif
99-
100-
#if PIKA_BUILTIN_STRUCT_ENABLE
101-
{
102-
.asmCode = "DCT",
103-
.astNodeName = "dict",
104-
.isUseNodeValue = PIKA_FALSE
105-
},
106-
{
107-
.asmCode = "LST",
108-
.astNodeName = "list",
109-
.isUseNodeValue = PIKA_FALSE
110-
},
111-
#endif
112-
113-
{
114-
.asmCode = "OUT",
115-
.astNodeName = "left",
116-
.isUseNodeValue = PIKA_TRUE
117-
}
118-
/* clang-format on */
119-
};
120-
12153
uint16_t Tokens_getSize(char* tokens) {
12254
if (strEqu("", tokens)) {
12355
return 0;
@@ -712,6 +644,16 @@ char* Lexer_getTokens(Args* outBuffs, char* stmt) {
712644
continue;
713645
}
714646
}
647+
/* in */
648+
if ('i' == c0) {
649+
if (('n' == c1) && (' ' == c2)) {
650+
tokens_arg =
651+
Lexer_setSymbel(tokens_arg, stmt, i, &symbol_start_index);
652+
tokens_arg = Lexer_setToken(tokens_arg, TOKEN_operator, " in ");
653+
i = i + 2;
654+
continue;
655+
}
656+
}
715657
/* as */
716658
if ('a' == c0) {
717659
if (('s' == c1) && (' ' == c2)) {
@@ -803,10 +745,10 @@ uint8_t Parser_isContainToken(char* tokens,
803745
}
804746

805747
static const char operators[][9] = {
806-
"**", "~", "*", "/", "%", "//", "+", "-",
807-
">>", "<<", "&", "^", "|", "<", "<=", ">",
808-
">=", "!=", "==", " is ", "%=", "/=", "//=", "-=",
809-
"+=", "*=", "**=", " not ", " and ", " or ", " import "};
748+
"**", "~", "*", "/", "%", "//", "+", "-",
749+
">>", "<<", "&", "^", "|", "<", "<=", ">",
750+
">=", "!=", "==", " is ", " in ", "%=", "/=", "//=",
751+
"-=", "+=", "*=", "**=", " not ", " and ", " or ", " import "};
810752

811753
char* Lexer_getOperator(Args* outBuffs, char* stmt) {
812754
Args buffs = {0};
@@ -1829,13 +1771,13 @@ AST* AST_parseLine(char* line, Stack* block_stack) {
18291771
goto block_matched;
18301772
}
18311773
if (strIsStartWith(line_start, "raise ")) {
1774+
AST_setThisNode(ast, "raise", "");
18321775
char* lineBuff = strsCopy(&buffs, line_start);
18331776
strsPopToken(&buffs, lineBuff, ' ');
18341777
stmt = lineBuff;
18351778
if (strEqu("", stmt)) {
18361779
stmt = "RuntimeError";
18371780
}
1838-
AST_setThisNode(ast, "raise", "");
18391781
goto block_matched;
18401782
}
18411783
#endif
@@ -2241,6 +2183,7 @@ char* Parser_fileToAsm(Args* outBuffs, char* filename) {
22412183
char* AST_appandPikaASM(AST* ast, AST* subAst, Args* outBuffs, char* pikaAsm) {
22422184
int deepth = obj_getInt(ast, "deepth");
22432185
Args buffs = {0};
2186+
/* append each queue item */
22442187
while (1) {
22452188
QueueObj* subStmt = queueObj_popObj(subAst);
22462189
if (NULL == subStmt) {
@@ -2249,17 +2192,32 @@ char* AST_appandPikaASM(AST* ast, AST* subAst, Args* outBuffs, char* pikaAsm) {
22492192
obj_setInt(ast, "deepth", deepth + 1);
22502193
pikaAsm = AST_appandPikaASM(ast, subStmt, &buffs, pikaAsm);
22512194
}
2195+
2196+
/* Byte code generate rules */
2197+
const GenRule rules_subAst[] = {
2198+
{._asm = "RUN", .type = VAL_DYNAMIC, .ast = "method"},
2199+
{._asm = "OPT", .type = VAL_DYNAMIC, .ast = "operator"},
2200+
{._asm = "BYT", .type = VAL_DYNAMIC, .ast = "bytes"},
2201+
{._asm = "NUM", .type = VAL_DYNAMIC, .ast = "num"},
2202+
{._asm = "IMP", .type = VAL_DYNAMIC, .ast = "import"},
2203+
{._asm = "REF", .type = VAL_DYNAMIC, .ast = "ref"},
2204+
{._asm = "STR", .type = VAL_DYNAMIC, .ast = "string"},
2205+
{._asm = "SLC", .type = VAL_NONEVAL, .ast = "slice"},
2206+
{._asm = "DCT", .type = VAL_NONEVAL, .ast = "dict"},
2207+
{._asm = "LST", .type = VAL_NONEVAL, .ast = "list"},
2208+
{._asm = "OUT", .type = VAL_DYNAMIC, .ast = "left"}};
2209+
22522210
char* buff = args_getBuff(&buffs, PIKA_SPRINTF_BUFF_SIZE);
22532211

22542212
/* append the syntax item */
2255-
for (size_t i = 0; i < sizeof(syntexItemList) / sizeof(SyntaxItem); i++) {
2256-
char* astNodeVal = obj_getStr(subAst, syntexItemList[i].astNodeName);
2213+
for (size_t i = 0; i < sizeof(rules_subAst) / sizeof(GenRule); i++) {
2214+
GenRule rule = rules_subAst[i];
2215+
char* astNodeVal = obj_getStr(subAst, rule.ast);
22572216
if (NULL != astNodeVal) {
22582217
/* e.g. "0 RUN print \n" */
2259-
__platform_sprintf(buff, "%d %s ", deepth,
2260-
syntexItemList[i].asmCode);
2218+
__platform_sprintf(buff, "%d %s ", deepth, rule._asm);
22612219
Arg* abuff = arg_newStr(buff);
2262-
if (syntexItemList[i].isUseNodeValue) {
2220+
if (rule.type == VAL_DYNAMIC) {
22632221
abuff = arg_strAppend(abuff, astNodeVal);
22642222
}
22652223
abuff = arg_strAppend(abuff, "\n");
@@ -2289,6 +2247,29 @@ char* ASM_addBlockDeepth(AST* ast,
22892247
return pikaAsm;
22902248
}
22912249

2250+
char* GenRule_toAsm(GenRule rule,
2251+
Args* buffs,
2252+
AST* ast,
2253+
char* pikaAsm,
2254+
int deepth) {
2255+
char* buff = args_getBuff(buffs, PIKA_SPRINTF_BUFF_SIZE);
2256+
/* parse stmt ast */
2257+
pikaAsm = AST_appandPikaASM(ast, ast, buffs, pikaAsm);
2258+
/* e.g. "0 CTN \n" */
2259+
__platform_sprintf(buff, "%d %s ", deepth, rule._asm);
2260+
Arg* abuff = arg_newStr(buff);
2261+
if (rule.type == VAL_DYNAMIC) {
2262+
abuff = arg_strAppend(abuff, obj_getStr(ast, rule.ast));
2263+
}
2264+
if (rule.type == VAL_STATIC_) {
2265+
abuff = arg_strAppend(abuff, rule.val);
2266+
}
2267+
abuff = arg_strAppend(abuff, "\n");
2268+
pikaAsm = strsAppend(buffs, pikaAsm, arg_getStr(abuff));
2269+
arg_deinit(abuff);
2270+
return pikaAsm;
2271+
}
2272+
22922273
char* AST_toPikaASM(AST* ast, Args* outBuffs) {
22932274
Args buffs = {0};
22942275
char* pikaAsm = strsCopy(&buffs, "");
@@ -2408,30 +2389,6 @@ char* AST_toPikaASM(AST* ast, Args* outBuffs) {
24082389
is_block_matched = 1;
24092390
goto exit;
24102391
}
2411-
if (strEqu(obj_getStr(ast, "block"), "while")) {
2412-
/* parse stmt ast */
2413-
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
2414-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 JEZ 2\n");
2415-
is_block_matched = 1;
2416-
goto exit;
2417-
}
2418-
if (strEqu(obj_getStr(ast, "block"), "if")) {
2419-
/* parse stmt ast */
2420-
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
2421-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 JEZ 1\n");
2422-
is_block_matched = 1;
2423-
goto exit;
2424-
}
2425-
if (strEqu(obj_getStr(ast, "block"), "else")) {
2426-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 NEL 1\n");
2427-
goto exit;
2428-
}
2429-
#if PIKA_SYNTAX_EXCEPTION_ENABLE
2430-
if (strEqu(obj_getStr(ast, "block"), "try")) {
2431-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 TRY \n");
2432-
goto exit;
2433-
}
2434-
#endif
24352392
if (strEqu(obj_getStr(ast, "block"), "elif")) {
24362393
/* skip if __else is 0 */
24372394
pikaAsm = strsAppend(&buffs, pikaAsm, "0 NEL 1\n");
@@ -2489,54 +2446,41 @@ char* AST_toPikaASM(AST* ast, Args* outBuffs) {
24892446
is_block_matched = 1;
24902447
goto exit;
24912448
}
2449+
/* generate code for block ast */
2450+
const GenRule rules_block[] = {
2451+
{._asm = "TRY", .type = VAL_NONEVAL, .ast = "try"},
2452+
{._asm = "NEL", .type = VAL_STATIC_, .ast = "else", .val = "1"},
2453+
{._asm = "JEZ", .type = VAL_STATIC_, .ast = "if", .val = "1"},
2454+
{._asm = "JEZ", .type = VAL_STATIC_, .ast = "while", .val = "2"},
2455+
};
24922456

2493-
if (obj_isArgExist(ast, "return")) {
2494-
/* parse stmt ast */
2495-
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
2496-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 RET \n");
2497-
is_block_matched = 1;
2498-
goto exit;
2499-
}
2500-
#if PIKA_SYNTAX_EXCEPTION_ENABLE
2501-
if (obj_isArgExist(ast, "raise")) {
2502-
/* parse stmt ast */
2503-
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
2504-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 RIS \n");
2505-
is_block_matched = 1;
2506-
goto exit;
2507-
}
2508-
#endif
2509-
if (obj_isArgExist(ast, "global")) {
2510-
/* parse stmt ast */
2511-
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
2512-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 GLB ");
2513-
pikaAsm = strsAppend(&buffs, pikaAsm, obj_getStr(ast, "global"));
2514-
pikaAsm = strsAppend(&buffs, pikaAsm, "\n");
2515-
is_block_matched = 1;
2516-
goto exit;
2517-
}
2518-
if (obj_isArgExist(ast, "del")) {
2519-
/* parse stmt ast */
2520-
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
2521-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 DEL ");
2522-
pikaAsm = strsAppend(&buffs, pikaAsm, obj_getStr(ast, "del"));
2523-
pikaAsm = strsAppend(&buffs, pikaAsm, "\n");
2524-
is_block_matched = 1;
2525-
goto exit;
2526-
}
2527-
if (obj_isArgExist(ast, "break")) {
2528-
/* parse stmt ast */
2529-
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
2530-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 BRK \n");
2531-
is_block_matched = 1;
2532-
goto exit;
2457+
for (size_t i = 0; i < sizeof(rules_block) / sizeof(GenRule); i++) {
2458+
GenRule rule = rules_block[i];
2459+
if (strEqu(obj_getStr(ast, "block"), rule.ast)) {
2460+
pikaAsm = GenRule_toAsm(rule, &buffs, ast, pikaAsm, 0);
2461+
is_block_matched = 1;
2462+
goto exit;
2463+
}
25332464
}
2534-
if (obj_isArgExist(ast, "continue")) {
2535-
/* parse stmt ast */
2536-
pikaAsm = AST_appandPikaASM(ast, ast, &buffs, pikaAsm);
2537-
pikaAsm = strsAppend(&buffs, pikaAsm, "0 CTN \n");
2538-
is_block_matched = 1;
2539-
goto exit;
2465+
2466+
const GenRule rules_topAst[] = {
2467+
{._asm = "CTN", .type = VAL_NONEVAL, .ast = "continue"},
2468+
{._asm = "BRK", .type = VAL_NONEVAL, .ast = "break"},
2469+
{._asm = "DEL", .type = VAL_DYNAMIC, .ast = "del"},
2470+
{._asm = "GLB", .type = VAL_DYNAMIC, .ast = "global"},
2471+
{._asm = "RIS", .type = VAL_DYNAMIC, .ast = "raise"},
2472+
{._asm = "ASS", .type = VAL_NONEVAL, .ast = "assert"},
2473+
{._asm = "RET", .type = VAL_NONEVAL, .ast = "return"}};
2474+
2475+
/* generate code for top level ast */
2476+
for (size_t i = 0; i < sizeof(rules_topAst) / sizeof(rules_topAst[0]);
2477+
i++) {
2478+
GenRule item = rules_topAst[i];
2479+
if (obj_isArgExist(ast, item.ast)) {
2480+
pikaAsm = GenRule_toAsm(item, &buffs, ast, pikaAsm, 0);
2481+
is_block_matched = 1;
2482+
goto exit;
2483+
}
25402484
}
25412485
exit:
25422486
if (NULL == pikaAsm) {

0 commit comments

Comments
 (0)