mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
fix l[x()] = b
parse err
This commit is contained in:
parent
a82f1ac74f
commit
1816e322ce
2
port/linux/.vscode/launch.json
vendored
2
port/linux/.vscode/launch.json
vendored
@ -11,7 +11,7 @@
|
||||
"program": "${workspaceFolder}/build/test/pikascript_test",
|
||||
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
||||
"args": [
|
||||
// "--gtest_filter=mqtt.subscribe"
|
||||
"--gtest_filter=parser.syntex_issue_l1l2"
|
||||
],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
|
@ -55,8 +55,9 @@ void Cursor_iterEnd(struct Cursor* cs);
|
||||
void Cursor_deinit(struct Cursor* cs);
|
||||
|
||||
/* Cursor high level api */
|
||||
char* Cursor_popToken(Args* buffs, char** stmt, char* devide);
|
||||
char* Cursor_popToken(Args* buffs, char** pStmt, char* devide);
|
||||
PIKA_BOOL Cursor_isContain(char* stmt, TokenType type, char* pyload);
|
||||
char* Cursor_splitCollect(Args* buffs, char* stmt, char* devide, int index);
|
||||
|
||||
char* Parser_linesToAsm(Args* outBuffs, char* multiLine);
|
||||
uint16_t TokenStream_getSize(char* tokenStream) {
|
||||
@ -980,11 +981,11 @@ PIKA_BOOL Cursor_isContain(char* stmt, TokenType type, char* pyload) {
|
||||
return res;
|
||||
}
|
||||
|
||||
char* Cursor_popToken(Args* buffs, char** tokenStream, char* devide) {
|
||||
char* Cursor_popToken(Args* buffs, char** pStmt, char* devide) {
|
||||
Arg* out_item = arg_newStr("");
|
||||
Arg* tokenStream_after = arg_newStr("");
|
||||
PIKA_BOOL is_find_devide = PIKA_FALSE;
|
||||
Cursor_forEachToken(cs, *tokenStream) {
|
||||
Cursor_forEachToken(cs, *pStmt) {
|
||||
Cursor_iterStart(&cs);
|
||||
if (!is_find_devide) {
|
||||
if ((cs.branket_deepth == 0 && strEqu(cs.token1.pyload, devide)) ||
|
||||
@ -1010,10 +1011,36 @@ char* Cursor_popToken(Args* buffs, char** tokenStream, char* devide) {
|
||||
char* token_after_str = strsCopy(buffs, arg_getStr(tokenStream_after));
|
||||
arg_deinit(tokenStream_after);
|
||||
/* update tokenStream */
|
||||
*tokenStream = token_after_str;
|
||||
*pStmt = token_after_str;
|
||||
return out_item_str;
|
||||
}
|
||||
|
||||
char* Cursor_splitCollect(Args* buffs, char* stmt, char* devide, int index) {
|
||||
Arg* out_arg = arg_newStr("");
|
||||
int expect_branket = 0;
|
||||
if (devide[0] == '(' || devide[0] == '[' || devide[0] == '{') {
|
||||
expect_branket = 1;
|
||||
}
|
||||
int i = 0;
|
||||
Cursor_forEachToken(cs, stmt) {
|
||||
Cursor_iterStart(&cs);
|
||||
if (cs.branket_deepth == expect_branket &&
|
||||
strEqu(cs.token1.pyload, devide)) {
|
||||
i++;
|
||||
if (i == index) {
|
||||
Cursor_iterEnd(&cs);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == index) {
|
||||
out_arg = arg_strAppend(out_arg, cs.token1.pyload);
|
||||
}
|
||||
Cursor_iterEnd(&cs);
|
||||
}
|
||||
Cursor_deinit(&cs);
|
||||
return strsCacheArg(buffs, out_arg);
|
||||
}
|
||||
|
||||
static void Slice_getPars(Args* outBuffs,
|
||||
char* inner,
|
||||
char** pStart,
|
||||
@ -1583,7 +1610,7 @@ __exit:
|
||||
|
||||
AST* AST_parseStmt(AST* ast, char* stmt) {
|
||||
Args buffs = {0};
|
||||
char* assignment = strsGetFirstToken(&buffs, stmt, '(');
|
||||
char* assignment = Cursor_splitCollect(&buffs, stmt, "(", 0);
|
||||
char* method = NULL;
|
||||
char* ref = NULL;
|
||||
char* str = NULL;
|
||||
|
@ -106,19 +106,19 @@ char* Parser_linesToArray(char* lines);
|
||||
char* instructUnit_fromAsmLine(Args* outBuffs, char* pikaAsm);
|
||||
ByteCodeFrame* byteCodeFrame_appendFromAsm(ByteCodeFrame* bf, char* pikaAsm);
|
||||
|
||||
#define Cursor_forEach(cursor) \
|
||||
#define _Cursor_forEach(cursor) \
|
||||
_Cursor_beforeIter(&cursor); \
|
||||
for (int __i = 0; __i < cursor.length; __i++)
|
||||
|
||||
#define Cursor_forEachTokenExistPs(cursor, tokenStream) \
|
||||
#define Cursor_forEachTokenExistPs(cursor, stmt) \
|
||||
/* init parserStage */ \
|
||||
_Cursor_init(&cursor); \
|
||||
_Cursor_parse(&cursor, tokenStream); \
|
||||
Cursor_forEach(cursor)
|
||||
_Cursor_parse(&cursor, stmt); \
|
||||
_Cursor_forEach(cursor)
|
||||
|
||||
#define Cursor_forEachToken(cursor, tokenStream) \
|
||||
#define Cursor_forEachToken(cursor, stmt) \
|
||||
struct Cursor cursor; \
|
||||
Cursor_forEachTokenExistPs(cursor, tokenStream)
|
||||
Cursor_forEachTokenExistPs(cursor, stmt)
|
||||
|
||||
uint16_t TokenStream_getSize(char* tokenStream);
|
||||
|
||||
|
@ -5104,7 +5104,6 @@ TEST(parser, syntex_issue_lwekj) {
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
#if 0 // NEED FIX
|
||||
TEST(parser, syntex_issue_lekj) {
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
@ -5112,17 +5111,36 @@ TEST(parser, syntex_issue_lekj) {
|
||||
printf("%s\r\n", lines);
|
||||
char* pikaAsm = Parser_linesToAsm(buffs, lines);
|
||||
printf("%s", pikaAsm);
|
||||
// EXPECT_STREQ(pikaAsm,
|
||||
// "B0\n"
|
||||
// "2 NUM 1\n"
|
||||
// "2 REF a\n"
|
||||
// "1 OPT in \n"
|
||||
// "0 OPT not \n"
|
||||
// "B0\n");
|
||||
EXPECT_STREQ(pikaAsm,
|
||||
"B0\n"
|
||||
"1 REF a\n"
|
||||
"1 RUN b\n"
|
||||
"1 NUM 1\n"
|
||||
"0 RUN __setitem__\n"
|
||||
"0 OUT a\n"
|
||||
"B0\n");
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(parser, syntex_issue_l1l2) {
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
char* lines = "test(a=1, b= 2)";
|
||||
printf("%s\r\n", lines);
|
||||
char* pikaAsm = Parser_linesToAsm(buffs, lines);
|
||||
printf("%s", pikaAsm);
|
||||
EXPECT_STREQ(pikaAsm,
|
||||
"B0\n"
|
||||
"1 NUM 1\n"
|
||||
"1 OUT a\n"
|
||||
"1 NUM 2\n"
|
||||
"1 OUT b\n"
|
||||
"0 RUN test\n"
|
||||
"B0\n");
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user