mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
fix bug of parser
This commit is contained in:
parent
6e7961d6bb
commit
1a14c82441
5
port/linux/.vscode/launch.json
vendored
5
port/linux/.vscode/launch.json
vendored
@ -18,8 +18,9 @@
|
||||
"program": "${workspaceFolder}/build/test/pikascript_test",
|
||||
// "program": "${workspaceFolder}/../build/src/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
||||
"args": [
|
||||
// "--gtest_filter=VM*",
|
||||
// "--gtest_filter=parser.while_true_false",
|
||||
// "--gtest_filter=VM.a_jjcc",
|
||||
// "--gtest_filter=lexser.jjcc",
|
||||
// "--gtest_filter=lexser.a_j",
|
||||
// "--gtest_filter=VM.for_break_byte",
|
||||
// "--gtest_filter=pikaMain.range",
|
||||
// "--gtest_filter=parser.while_true_block",
|
||||
|
@ -2606,3 +2606,34 @@ TEST(parser, multiLine_comment) {
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(parser, plus_equ) {
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
char* lines = (char*)"a += 1+1\n";
|
||||
printf("%s", lines);
|
||||
char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
|
||||
printf("%s", pikaAsm);
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(lexser, a_j) {
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
Args* buffs = New_strBuff();
|
||||
|
||||
/* run */
|
||||
char* tokens = Lexer_getTokens(buffs, (char*)"a=");
|
||||
char* printTokens = Lexer_printTokens(buffs, tokens);
|
||||
printf((char*)"%s\n", printTokens);
|
||||
|
||||
/* assert */
|
||||
EXPECT_STREQ(printTokens,
|
||||
"{sym}a{opt}=");
|
||||
|
||||
|
||||
/* deinit */
|
||||
args_deinit(buffs);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
@ -39,6 +39,7 @@ char* AST_toPikaASM(AST* ast, Args* outBuffs);
|
||||
char* Lexer_getTokens(Args* outBuffs, char* stmt);
|
||||
int32_t AST_deinit(AST* ast);
|
||||
char* Parser_multiLineToAsm(Args* outBuffs, char* multiLine);
|
||||
uint8_t Lexer_isContain(char* tokens, enum TokenType token_type, char* pyload);
|
||||
|
||||
uint16_t Lexer_getTokenSize(char* tokens) {
|
||||
if (strEqu("", tokens)) {
|
||||
@ -118,24 +119,6 @@ char* strsGetCleanCmd(Args* outBuffs, char* cmd) {
|
||||
return strOut;
|
||||
}
|
||||
|
||||
enum TokenType {
|
||||
TOKEN_strEnd = 0,
|
||||
TOKEN_symbol,
|
||||
TOKEN_keyword,
|
||||
TOKEN_operator,
|
||||
TOKEN_devider,
|
||||
TOKEN_literal,
|
||||
};
|
||||
|
||||
enum StmtType {
|
||||
STMT_reference,
|
||||
STMT_string,
|
||||
STMT_number,
|
||||
STMT_method,
|
||||
STMT_operator,
|
||||
STMT_none,
|
||||
};
|
||||
|
||||
char* strsDeleteBetween(Args* buffs_p, char* strIn, char begin, char end) {
|
||||
int32_t size = strGetSize(strIn);
|
||||
char* strOut = args_getBuff(buffs_p, size);
|
||||
@ -232,20 +215,6 @@ exit:
|
||||
return stmtType;
|
||||
}
|
||||
|
||||
uint8_t Parser_checkIsDirect(char* str) {
|
||||
/* include '0' */
|
||||
uint32_t size = strGetSize(str) + 1;
|
||||
for (uint32_t i = 1; i + 1 < size; i++) {
|
||||
if ((str[i - 1] != '%') && (str[i - 1] != '!') && (str[i - 1] != '<') &&
|
||||
(str[i - 1] != '>') && (str[i - 1] != '=') && (str[i - 1] != '+') &&
|
||||
(str[i - 1] != '-') && (str[i - 1] != '*') && (str[i - 1] != '/') &&
|
||||
(str[i + 1] != '=') && (str[i] == '=')) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* Lexer_printTokens(Args* outBuffs, char* tokens) {
|
||||
/* init */
|
||||
Args buffs = {0};
|
||||
@ -278,6 +247,19 @@ char* Lexer_printTokens(Args* outBuffs, char* tokens) {
|
||||
return printOut;
|
||||
}
|
||||
|
||||
uint8_t Parser_checkIsDirect(char* str) {
|
||||
Args buffs = {0};
|
||||
char* tokens = Lexer_getTokens(&buffs, str);
|
||||
uint8_t res = 0;
|
||||
if (Lexer_isContain(tokens, TOKEN_operator, "=")) {
|
||||
res = 1;
|
||||
goto exit;
|
||||
}
|
||||
exit:
|
||||
strsDeinit(&buffs);
|
||||
return res;
|
||||
}
|
||||
|
||||
Arg* Lexer_setToken(Arg* tokens_arg,
|
||||
enum TokenType token_type,
|
||||
char*
|
||||
@ -344,6 +326,9 @@ char* Lexer_getTokens(Args* outBuffs, char* stmt) {
|
||||
for (int32_t i = 0; i < size; i++) {
|
||||
/* update char */
|
||||
c0 = stmt[i];
|
||||
c1 = 0;
|
||||
c2 = 0;
|
||||
c3 = 0;
|
||||
if (i + 1 < size) {
|
||||
c1 = stmt[i + 1];
|
||||
}
|
||||
@ -411,7 +396,7 @@ char* Lexer_getTokens(Args* outBuffs, char* stmt) {
|
||||
('~' == c0)) {
|
||||
if (('*' == c0) || ('/' == c0)) {
|
||||
/*
|
||||
//=, **=
|
||||
//=, **=
|
||||
*/
|
||||
if ((c0 == c1) && ('=' == c2)) {
|
||||
char content[4] = {0};
|
||||
@ -785,23 +770,21 @@ AST* AST_parseStmt(AST* ast, char* stmt) {
|
||||
char* num = NULL;
|
||||
char* left = NULL;
|
||||
char* right = NULL;
|
||||
/* solve left */
|
||||
|
||||
/* solve check direct */
|
||||
uint8_t isLeftExist = 0;
|
||||
if (Parser_checkIsDirect(assignment)) {
|
||||
isLeftExist = 1;
|
||||
}
|
||||
if (isLeftExist) {
|
||||
left = strsGetFirstToken(&buffs, assignment, '=');
|
||||
}
|
||||
/* solve right stmt */
|
||||
if (isLeftExist) {
|
||||
right = strPointToLastToken(stmt, '=');
|
||||
} else {
|
||||
right = stmt;
|
||||
}
|
||||
|
||||
/* solve the [] stmt */
|
||||
right = Parser_solveRightBranckets(&buffs, right);
|
||||
char* right_new = Parser_solveLeftBranckets(&buffs, right, left);
|
||||
|
||||
/* left is contain the '[]' */
|
||||
if (!strEqu(right_new, right)) {
|
||||
/* update new right */
|
||||
@ -809,6 +792,8 @@ AST* AST_parseStmt(AST* ast, char* stmt) {
|
||||
/* cancel left */
|
||||
isLeftExist = 0;
|
||||
}
|
||||
|
||||
/* set left */
|
||||
if (isLeftExist) {
|
||||
obj_setStr(ast, (char*)"left", left);
|
||||
}
|
||||
|
@ -38,6 +38,24 @@ typedef struct Asmer_t {
|
||||
char* line_pointer;
|
||||
} Asmer;
|
||||
|
||||
enum TokenType {
|
||||
TOKEN_strEnd = 0,
|
||||
TOKEN_symbol,
|
||||
TOKEN_keyword,
|
||||
TOKEN_operator,
|
||||
TOKEN_devider,
|
||||
TOKEN_literal,
|
||||
};
|
||||
|
||||
enum StmtType {
|
||||
STMT_reference,
|
||||
STMT_string,
|
||||
STMT_number,
|
||||
STMT_method,
|
||||
STMT_operator,
|
||||
STMT_none,
|
||||
};
|
||||
|
||||
char* Parser_multiLineToAsm(Args* outBuffs, char* multiLine);
|
||||
char* instructUnit_fromAsmLine(Args* outBuffs, char* pikaAsm);
|
||||
char* Parser_byteCodeToAsm(Args* outBuffs, char* pikaByteCode);
|
||||
|
Loading…
x
Reference in New Issue
Block a user