diff --git a/main.c b/main.c index eca4062..8646743 100644 --- a/main.c +++ b/main.c @@ -12,11 +12,12 @@ -const char g_str[ ] = "int main(){\n" -"int index=1000;\n" -"while(index--){\n" -"printf(index)\n" -"}\n" +const char g_str[] = +"int main() {\n" +" int index=-1000;\n" +" while(index--){\n" +" printf(index>=0);\n" +" }\n" "}"; diff --git a/soft/clexical.c b/soft/clexical.c index 8713329..5a16102 100644 --- a/soft/clexical.c +++ b/soft/clexical.c @@ -252,8 +252,9 @@ int lex_analysis(const char *text,int len){ lex.input_len = len; lex_get_next(&lex); lex.current_line_pos = 0; - while(in_loop){ - switch (lex.current_c) + while (in_loop) { + int _char = lex.current_c; + switch (_char) { case 0: { in_loop = 0; @@ -289,7 +290,7 @@ int lex_analysis(const char *text,int len){ case ':': { lex_save_char(&lex); - lex.token_buff.token = lex.current_c; + lex.token_buff.token = _char; lex_save_token(&lex); lex_get_next(&lex); break; @@ -322,7 +323,7 @@ int lex_analysis(const char *text,int len){ lex_get_next(&lex); lex.token_buff.token = TOKEN_INC; }else{ - lex.token_buff.token = lex.current_c; + lex.token_buff.token = _char; } lex_save_token(&lex); break; @@ -335,7 +336,7 @@ int lex_analysis(const char *text,int len){ lex_get_next(&lex); lex.token_buff.token = TOKEN_DEC; }else{ - lex.token_buff.token = lex.current_c; + lex.token_buff.token = _char; } lex_save_token(&lex); break; @@ -343,15 +344,24 @@ int lex_analysis(const char *text,int len){ case '!': 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; + switch (_char) + { + case '!':lex.token_buff.token = TOKEN_NEQ;break; + case '>':lex.token_buff.token = TOKEN_GEQ;break; + case '<':lex.token_buff.token = TOKEN_LEQ;break; + case '=':lex.token_buff.token = TOKEN_EQ;break; + default: + DBG_ERR("未知的情况('%c'): 在 %d 行" , lex.current_c , lex.current_line); + break; + } }else{ - lex.token_buff.token = lex.current_c; + lex.token_buff.token = _char; } lex_save_token(&lex); break; @@ -380,7 +390,7 @@ int lex_analysis(const char *text,int len){ int token_len=0; token_def *tlist=lex_cpy_token_list(&lex , &token_len); lex_del_token_list(&lex); - par_parser(tlist , token_len); + // par_parser(tlist , token_len); mem_free(tlist); DBG_LOG("解析结束."); return 0; diff --git a/soft/parser.c b/soft/parser.c new file mode 100644 index 0000000..a6af18a --- /dev/null +++ b/soft/parser.c @@ -0,0 +1,9 @@ +// #include "parser.h" + + + + + + + + diff --git a/soft/parser.h b/soft/parser.h new file mode 100644 index 0000000..038dda3 --- /dev/null +++ b/soft/parser.h @@ -0,0 +1,55 @@ +#ifndef parser_h__ +#define parser_h__ + + +// c语言语义分析 + +// 变量类型 +typedef enum { + VTYPE_VOID = 0 , + VTYPE_CHAR = 1 , + VTYPE_SHORT = 2 , + VTYPE_INT = 3 , + VTYPE_PTR = 4 , + VTYPE_FUNC = 5 , +}variable_type_def; + +// 语句类型 +typedef enum { + STYPE_NONE = 0,// 代码文件 + STYPE_TYPEDEF = 1 ,// 类型定义 typedef + STYPE_VDECLARE = 2 ,// 变量声明 + STYPE_FDECLARE = 3 ,// 函数声明 + STYPE_STRUCT = 4 ,// 结构体语句 + STYPE_ENUM = 5 ,// 枚举语句 + STYPE_UNION = 6 ,// 联合体语句 + STYPE_FDEF = 7 ,// 函数定义 + STYPE_PARLIST = 8 ,// 参数列表 + STYPE_BLOCK = 9,// 代码块 +}sentence_type_def; + +// 属性类型 可以组合 +typedef enum { + ATYPE_VOID = 0 ,// 无属性 + ATYPE_STATIC = 1 ,// 静态 + ATYPE_CONST = 2 ,//只读 + ATYPE_EXTERN = 4 ,// 外部 + ATYPE_UNSIGNED = 8,// 无符号 +}attr_def; + + +struct token_def; + +typedef struct _par_node { + int sentence_type; + int attr_type; + token_def* token_list; + int token_len; + struct _par_node* next; + struct _par_node* chid; + char name[1024]; +}par_node_def; + + + +#endif