fix bug of parser

This commit is contained in:
lyon1998 2022-03-31 14:33:56 +08:00
parent 6e7961d6bb
commit 1a14c82441
4 changed files with 76 additions and 41 deletions

View File

@ -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",

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);