diff --git a/soft/clexical.c b/soft/clexical.c index e3d34c9..31ab7ca 100644 --- a/soft/clexical.c +++ b/soft/clexical.c @@ -33,7 +33,14 @@ typedef enum { TOKEN_LEQ = 273,// 小于等于 TOKEN_GEQ = 274,// 大于等于 TOKEN_ELSE = 275, - TOKEN_CONTINUE = 276, + TOKEN_CONTINUE = 276 , + TOKEN_CONST = 277 , + TOKEN_STATIC = 278 , + TOKEN_UNSIGNED = 279 , + TOKEN_TYPEDEF = 280 , + TOKEN_STRUCT = 281 , + TOKEN_ENUM = 282 , + TOKEN_UNION = 283, }token_index_def; @@ -57,6 +64,13 @@ const keywork_item_def g_keyword_table[ ] = { TOKEN_DEF(int,TOKEN_INT), TOKEN_DEF(void,TOKEN_VOID), TOKEN_DEF(continue,TOKEN_CONTINUE), + TOKEN_DEF(const,TOKEN_CONST), + TOKEN_DEF(static,TOKEN_STATIC), + TOKEN_DEF(unisgned,TOKEN_UNSIGNED), + TOKEN_DEF(typedef,TOKEN_TYPEDEF), + TOKEN_DEF(struct,TOKEN_STRUCT), + TOKEN_DEF(enum,TOKEN_ENUM), + TOKEN_DEF(union,TOKEN_UNION), {NULL}, }; @@ -201,20 +215,36 @@ int lex_del_token_list(lex_def* lex) { return 0; } +// 把 token list 保存到一个数组 len 保存数组的长度 +token_def* lex_cpy_token_list(lex_def* lex,int *len) { + token_list_def* l = &lex->tlist; + token_list_node_def* t; + token_def* r = mem_calloc(l->len , sizeof(token_def)); + if (len) *len = l->len; + t = l->head; + for (int i = 0;i < l->len;i++) { + memcpy(&r [i] , &t->token , sizeof(token_def)); + t = t->next; + } + return r; +} + + + // 打印 token list int lex_print_token_list(lex_def* lex) { token_list_def* l = &lex->tlist; token_list_node_def* t; t = l->head; while (t) { - printf("\"%s\":%d[%d,%d],token=%d\n" , t->token.buff , t->token.line , t->token.pos , - t->token.pos + t->token.used -1 , t->token.token); + printf("%4d[%3d,%3d],token=%4d \"%s\"\n" , t->token.line , t->token.pos , + t->token.used , t->token.token, t->token.buff ); t = t->next; } return 0; } - +int par_parser(token_def* token_list , int len); int lex_analysis(const char *text,int len){ lex_def lex = { 0 }; int in_loop = 1; @@ -347,9 +377,231 @@ int lex_analysis(const char *text,int len){ } } lex_print_token_list(&lex); + int token_len=0; + token_def *tlist=lex_cpy_token_list(&lex , &token_len); lex_del_token_list(&lex); + par_parser(tlist , token_len); + mem_free(tlist); + DBG_LOG("解析结束."); return 0; } +// 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; + + +// token类型 +typedef enum { + TTYPE_NONE = 0, + TTYPE_ATTR = 1 ,// 属性声明关键字 + TTYPE_TYPE = 2 ,// 类型声明关键字 + TTYPE_PROC = 3 ,// 流程控制关键字 + TTYPE_OP = 4,// 操作关键字 +}token_type_def; + + +// 变量的描述 +typedef struct _describe_var { + int attribute;// 属性 静态 只读 无符号 等 + int type;// 类型 + void* value;// 变量的值 +}describe_var_def; + +// 函数类型的描述 +typedef struct _describe_fun { + int attribute;// 函数类型 + int type;// 返回值类型 + int par_num;// 参数个数 + describe_var_def* par_list;// 参数列表 +}describe_fun_def; + +typedef union _describe_union +{ + describe_var_def v; + describe_fun_def f; +}describe_def; + +// 获取各属性的宏 +#define des_get_value(des,v,a) (des)->v.a + + +typedef struct _par_def +{ + int attribute;// 属性 静态 只读 无符号 等 + int type;// 类型 声明 定义 变量 函数 等 + char name [TOKEN_BUFF_MAX_LEN];// 变量名称 + describe_def des;// 描述语句内容 + token_def* token_list; // 此语句包含的token起始 + int token_list_len;// 此语句tokenlist的长度 + int child_num;// 子语句数量 + struct _par_def* child;// 子语句 + struct _par_def* next;// 下一个语句 +}par_def; + + + + + + + + +// 定义区分语句类型的token type list +const int* g_token_type_list[ ] = { + {2,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {2,VTYPE_INT,TOKEN_NAME},// 函数定义 + {2,VTYPE_VOID,TOKEN_NAME},// 函数定义 + + {3,ATYPE_CONST,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {3,ATYPE_CONST,VTYPE_INT,TOKEN_NAME},// 函数定义 + {3,ATYPE_CONST,VTYPE_VOID,TOKEN_NAME},// 函数定义 + + {4,ATYPE_STATIC,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {4,ATYPE_STATIC,VTYPE_INT,TOKEN_NAME},// 函数定义 + {4,ATYPE_STATIC,VTYPE_VOID,TOKEN_NAME},// 函数定义 + + {4,ATYPE_STATIC,ATYPE_CONST,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {4,ATYPE_STATIC,ATYPE_CONST,VTYPE_INT,TOKEN_NAME},// 函数定义 + {4,ATYPE_STATIC,ATYPE_CONST,VTYPE_VOID,TOKEN_NAME},// 函数定义 + + {4,ATYPE_CONST,ATYPE_STATIC,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {4,ATYPE_CONST,ATYPE_STATIC,VTYPE_INT,TOKEN_NAME},// 函数定义 + {4,ATYPE_CONST,ATYPE_STATIC,VTYPE_VOID,TOKEN_NAME},// 函数定义 + + {3,ATYPE_UNSIGNED,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {3,ATYPE_UNSIGNED,VTYPE_INT,TOKEN_NAME},// 函数定义 + + {4,ATYPE_CONST,ATYPE_UNSIGNED,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {4,ATYPE_CONST,ATYPE_UNSIGNED,VTYPE_INT,TOKEN_NAME},// 函数定义 + + {4,ATYPE_STATIC,ATYPE_UNSIGNED,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {4,ATYPE_STATIC,ATYPE_UNSIGNED,VTYPE_INT,TOKEN_NAME},// 函数定义 + + {5,ATYPE_STATIC,ATYPE_CONST,ATYPE_UNSIGNED,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {5,ATYPE_STATIC,ATYPE_CONST,ATYPE_UNSIGNED,VTYPE_INT,TOKEN_NAME},// 函数定义 + + {5,ATYPE_CONST,ATYPE_STATIC,ATYPE_UNSIGNED,VTYPE_CHAR,TOKEN_NAME},// 函数定义 + {5,ATYPE_CONST,ATYPE_STATIC,ATYPE_UNSIGNED,VTYPE_INT,TOKEN_NAME},// 函数定义 + {0} +}; + +static int _par_compare_token_type(int* t, token_def* token_list , int len) { + for (int j = 0;j < len;j++) { + if (t [j] != token_list [j].token) { + return 0; + } + } + return 1; +} + +// 对token列表进行合法性审查 如果返回不小于0 则可能是变量声明 函数声明 函数定义 +int par_legality_review(token_def* token_list , int len) { + const int* t[ ] = g_token_type_list; + int ret = -1; + for (int i = 0;t [i][0];i++) { + // 对比token类型 + if (len >= t [i][0]) { + ret = _par_compare_token_type(&t [i][1] , token_list , t [i][0]); + if (ret) { + return i; + } + } + } + return -1; +} + + + +// 解析一个范围内的token list +int par_statement(par_def* p) { + token_def* t = p->token_list; + par_def* par = mem_calloc(1 , sizeof(par_def)); + int type = -1; + for (int i = 0;i < p->token_list_len;i++) { + int ttype = t [i].token; + switch (ttype) { + case TOKEN_CHAR: + type = VTYPE_CHAR; + break; + case TOKEN_INT: + type = VTYPE_INT; + break; + case TOKEN_VOID: + type = VTYPE_VOID; + break; + case TOKEN_CONST: + par->attribute |= ATYPE_CONST; + break; + case TOKEN_STATIC: + par->attribute |= ATYPE_STATIC; + break; + case TOKEN_UNSIGNED: + par->attribute |= ATYPE_UNSIGNED; + break; + case TOKEN_NAME: + memcpy(par->name , t [i].buff , t [i].used); + if (par_legality_review(t , p->token_list_len) >= 0) { + if (i + 1 >= p->token_list_len) { + throw_("缺少后续标识符 line=%d,pos=%d" , t [i].line , t [i].pos); + } + if (t [i + 1].token == ';') { + // 变量声明 + par->type = STYPE_VDECLARE; + } + + } + break; + default: + break; + } + } +} + + + +// 输入token数组和长度 +int par_parser(token_def* token_list , int len) { + int in_loop = 1; + int index = 0; + par_def* par = mem_calloc(1 , sizeof(par_def)); + par->type = TTYPE_NONE; + par->attribute = 0; + par->token_list = token_list; + par->token_list_len = len; + +} + +