From ef7a4fdf4b7571c5be081b96f41ec74da218775b Mon Sep 17 00:00:00 2001 From: andy <1414772332@qq.com> Date: Wed, 30 Oct 2024 23:30:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=8C=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7=E7=9A=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.c | 4 ++-- soft/clexical.c | 60 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/main.c b/main.c index 5032add..eca4062 100644 --- a/main.c +++ b/main.c @@ -13,8 +13,8 @@ const char g_str[ ] = "int main(){\n" -"int index;\n" -"while(1){\n" +"int index=1000;\n" +"while(index--){\n" "printf(index)\n" "}\n" "}"; diff --git a/soft/clexical.c b/soft/clexical.c index 7ea0d62..e3d34c9 100644 --- a/soft/clexical.c +++ b/soft/clexical.c @@ -23,7 +23,17 @@ typedef enum { TOKEN_INT=263, TOKEN_VOID=264, TOKEN_NAME = 265 , - TOKEN_NUM = 266 , + TOKEN_NUM = 266 ,// 数字 + TOKEN_INC = 267,// 自增 + TOKEN_DEC = 268,// 自减 + TOKEN_EQ = 269,// 相等 + TOKEN_NEQ = 270,// 不相等 + TOKEN_LSH = 271,// 左移 + TOKEN_RSH = 272,// 右移 + TOKEN_LEQ = 273,// 小于等于 + TOKEN_GEQ = 274,// 大于等于 + TOKEN_ELSE = 275, + TOKEN_CONTINUE = 276, }token_index_def; @@ -37,6 +47,7 @@ typedef struct { const keywork_item_def g_keyword_table[ ] = { TOKEN_DEF(if,TOKEN_IF), + TOKEN_DEF(else,TOKEN_ELSE), TOKEN_DEF(break,TOKEN_IF), TOKEN_DEF(while,TOKEN_WHILE), TOKEN_DEF(switch,TOKEN_SWITCH), @@ -45,7 +56,8 @@ const keywork_item_def g_keyword_table[ ] = { TOKEN_DEF(char,TOKEN_CHAR), TOKEN_DEF(int,TOKEN_INT), TOKEN_DEF(void,TOKEN_VOID), - {NULL } , + TOKEN_DEF(continue,TOKEN_CONTINUE), + {NULL}, }; @@ -242,12 +254,10 @@ int lex_analysis(const char *text,int len){ case '[': case ']': case '~': - case '!': case ',': case ';': case ':': { - DBG_LOG("enter %c" , lex.current_c); lex_save_char(&lex); lex.token_buff.token = lex.current_c; lex_save_token(&lex); @@ -274,6 +284,48 @@ int lex_analysis(const char *text,int len){ } break; } + case '+':{ + lex_save_char(&lex); + lex_get_next(&lex); + if(lex.current_c=='+'){ + lex_save_char(&lex); + lex_get_next(&lex); + lex.token_buff.token = TOKEN_INC; + }else{ + lex.token_buff.token = lex.current_c; + } + lex_save_token(&lex); + break; + } + case '-':{ + lex_save_char(&lex); + lex_get_next(&lex); + if(lex.current_c=='-'){ + lex_save_char(&lex); + lex_get_next(&lex); + lex.token_buff.token = TOKEN_DEC; + }else{ + lex.token_buff.token = lex.current_c; + } + lex_save_token(&lex); + break; + } + case '!': + case '>': + case '<': + case '=':{ + lex_save_char(&lex); + lex_get_next(&lex); + if(lex.current_c=='='){ + lex_save_char(&lex); + lex_get_next(&lex); + lex.token_buff.token = TOKEN_EQ; + }else{ + lex.token_buff.token = lex.current_c; + } + lex_save_token(&lex); + break; + } default: if (cislalpha(lex.current_c)) { do {