添加符号和数字的解析

This commit is contained in:
ranchuan
2024-10-30 19:08:46 +08:00
parent 93a8c2c265
commit 01a7999d55
7 changed files with 264 additions and 56 deletions

34
main.c
View File

@@ -6,15 +6,26 @@
#include "soft/mythread.h" #include "soft/mythread.h"
#include "unistd.h" #include "unistd.h"
#include "soft/debug.h" #include "soft/debug.h"
#include "string.h"
#include "soft/clexical.h"
int thread_fun(void *t){
const char g_str[ ] = "int main(){\n"
"int index;\n"
"while(1){\n"
"printf(index)\n"
"}\n"
"}";
int thread_fun(void* t) {
DBG_INFO("run in thread_fun.\n"); DBG_INFO("run in thread_fun.\n");
lex_analysis(g_str , strlen(g_str));
while(1){
sleep(5);
throw_("s");
}
return 0; return 0;
} }
@@ -26,18 +37,9 @@ int main(int argc,char *argv[]){
debug_init(NULL); debug_init(NULL);
DBG_INFO("hello world.%ld\n",(size_t)pthread_self()); DBG_INFO("hello world.%ld\n",(size_t)pthread_self());
myth_create(thread_fun , NULL);
myth_join( );
// while(p&&(*p)){
// printf("%s\n",*p++);
// }
// printf("a+b=%d",test_add(3,5));
myth_create(thread_fun,NULL);
myth_create(NULL,NULL);
// sleep(10);
myth_join();
} }

View File

@@ -6,33 +6,68 @@
#include "mythread.h" #include "mythread.h"
#include "unistd.h" #include "unistd.h"
#include "debug.h" #include "debug.h"
#include "string.h"
#include "ctype.h"
// c语言词法分析 // c语言词法分析
const char *g_keyword_table[]={
"if","break","while","switch","case","do",
"char","int","void",
};
typedef enum { typedef enum {
TOKEN_IF = 256, TOKEN_IF = 256,
TOKEN_BREAK, TOKEN_BREAK = 257,
TOKEN_WHILE, TOKEN_WHILE=258,
TOKEN_SWITCH, TOKEN_SWITCH=259,
TOKEN_CASE, TOKEN_CASE=260,
TOKEN_DO, TOKEN_DO=261,
TOKEN_CHAR, TOKEN_CHAR=262,
TOKEN_INT, TOKEN_INT=263,
TOKEN_VOID, TOKEN_VOID=264,
TOKEN_NAME, TOKEN_NAME = 265 ,
}token_def; TOKEN_NUM = 266 ,
}token_index_def;
typedef struct {
const char* key;
const token_index_def token;
const char* token_str;
}keywork_item_def;
#define TOKEN_DEF(s,t) {#s,t,#t}
const keywork_item_def g_keyword_table[ ] = {
TOKEN_DEF(if,TOKEN_IF),
TOKEN_DEF(break,TOKEN_IF),
TOKEN_DEF(while,TOKEN_WHILE),
TOKEN_DEF(switch,TOKEN_SWITCH),
TOKEN_DEF(case,TOKEN_CASE),
TOKEN_DEF(do,TOKEN_DO),
TOKEN_DEF(char,TOKEN_CHAR),
TOKEN_DEF(int,TOKEN_INT),
TOKEN_DEF(void,TOKEN_VOID),
{NULL } ,
};
#define TOKEN_BUFF_MAX_LEN 128 #define TOKEN_BUFF_MAX_LEN 128
// 字母 下划线
#define cislalpha(c) (isalpha(c) || (c) == '_')
// 数字 字母 下划线
#define cislalnum(c) (isalnum(c) || (c) == '_')
// 数字
#define cisdigit(c) (isdigit(c))
// 空白
#define cisspace(c) (isspace(c))
// 可打印字符
#define cisprint(c) (isprint(c))
// 16进制数字
#define cisxdigit(c) (isxdigit(c))
// 转换为小写
#define ctolower(c) (tolower(c))
typedef struct{ typedef struct{
char buff[TOKEN_BUFF_MAX_LEN]; char buff[TOKEN_BUFF_MAX_LEN];
int used; int used;
@@ -41,22 +76,58 @@ typedef struct{
int token; int token;
}token_def; }token_def;
typedef struct{
typedef struct _token_list {
token_def token;
struct _token_list* next;
}token_list_node_def;
typedef struct {
token_list_node_def* head;
token_list_node_def* current;
int len;
}token_list_def;
typedef struct {
int current_c; int current_c;
int current_line; int current_line;
int current_line_pos; int current_line_pos;
token_def token_buff; token_def token_buff;
char *input_text; const char *input_text;
int input_len; int input_len;
int input_pos; int input_pos;
token_list_def tlist;
}lex_def; }lex_def;
// 对比关键字 返回其token
int lex_compare_keywords(const char* key) {
const keywork_item_def* ckey = g_keyword_table;
int index = 0;
while (ckey[index].key != NULL) {
if (strcmp(ckey[index].key , key) == 0) {
return ckey[index].token;
}
index++;
}
return -1;
}
// 获取下一个字符 返回0成功 // 获取下一个字符 返回0成功
int lex_get_next(lex_def *lex) int lex_get_next(lex_def *lex)
{ {
token_def *t=&lex->token_buff; if (lex->input_pos >= lex->input_len) {
if(lex->input_pos>=lex->input_len){ lex->current_c = 0;
return -1; return -1;
} }
lex->current_c=lex->input_text[lex->input_pos]; lex->current_c=lex->input_text[lex->input_pos];
@@ -72,26 +143,84 @@ int lex_save_char(lex_def *lex){
if(t->used>=TOKEN_BUFF_MAX_LEN){ if(t->used>=TOKEN_BUFF_MAX_LEN){
return -1; return -1;
} }
if (t->used == 0) {
t->pos = lex->current_line_pos;
t->line=lex->current_line;
}
t->buff[t->used]=lex->current_c; t->buff[t->used]=lex->current_c;
t->used++; t->used++;
t->line=lex->current_line;
t->pos=lex->current_line_pos;
return 0; return 0;
} }
// 保存一个token
int lex_save_token(lex_def* lex) {
token_list_node_def* t = mem_calloc(1 , sizeof(token_list_node_def));
token_list_def* l = &lex->tlist;
memcpy(&t->token , &lex->token_buff , sizeof(token_def));
memset(&lex->token_buff , 0 , sizeof(token_def));
if (l->head == NULL) {
l->head = t;
} else {
l->current->next = t;
if (l->head->next == NULL) {
l->head->next = t;
}
}
l->current = t;
l->len++;
return 0;
}
// 删除 token list
int lex_del_token_list(lex_def* lex) {
token_list_def* l = &lex->tlist;
token_list_node_def* t;
while (l->len > 0) {
t = l->head->next;
mem_free(l->head);
l->head = t;
l->len--;
}
l->head = NULL;
l->current = NULL;
return 0;
}
// 打印 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);
t = t->next;
}
return 0;
}
int lex_analysis(const char *text,int len){ int lex_analysis(const char *text,int len){
lex_def lex={0}; lex_def lex = { 0 };
lex.input_text=text; int in_loop = 1;
lex.input_len=len; lex.input_text = text;
lex.input_len = len;
lex_get_next(&lex); lex_get_next(&lex);
while(1){ lex.current_line_pos = 0;
while(in_loop){
switch (lex.current_c) switch (lex.current_c)
{ {
case '\r':{ case 0: {
in_loop = 0;
break;
}
case '\r': {
lex_get_next(&lex); lex_get_next(&lex);
}
case '\n': {
if(lex.current_c=='\n'){ if(lex.current_c=='\n'){
lex_get_next(&lex); lex_get_next(&lex);
} }
@@ -99,14 +228,75 @@ int lex_analysis(const char *text,int len){
lex.current_line_pos=0; lex.current_line_pos=0;
break; break;
} }
case ' ':case '\t':case '\v':case '\f':{ case ' ':
case '\t':
case '\v':
case '\f': {
lex_get_next(&lex); lex_get_next(&lex);
lex.current_line_pos++; break;
}
case '(':
case ')':
case '{':
case '}':
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);
lex_get_next(&lex);
break;
}
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':{
if (cisdigit(lex.current_c)) {
do {
lex_save_char(&lex);
lex_get_next(&lex);
} while (cisdigit(lex.current_c));
lex.token_buff.token = TOKEN_NUM;
lex_save_token(&lex);
}
break;
} }
default: default:
if (cislalpha(lex.current_c)) {
do {
lex_save_char(&lex);
lex_get_next(&lex);
} while (cislalnum(lex.current_c));
int token = lex_compare_keywords(lex.token_buff.buff);
if (token != -1) {
lex.token_buff.token = token;
} else {
lex.token_buff.token = TOKEN_NAME;
}
lex_save_token(&lex);
} else {
DBG_ERR("未知的符号('%c'): 在 %d 行" , lex.current_c , lex.current_line);
in_loop = 0;
}
break; break;
} }
} }
lex_print_token_list(&lex);
lex_del_token_list(&lex);
return 0;
} }

13
soft/clexical.h Normal file
View File

@@ -0,0 +1,13 @@
#ifndef clexical_h__
#define clexical_h__
int lex_analysis(const char* text , int len);
#endif

View File

@@ -44,11 +44,11 @@ int _sem_init(){
key_t key; key_t key;
int mutex; int mutex;
key = ftok(".",5345); key = ftok(".",5345);
printf("sem init, key=%llu\n",key); // printf("sem init, key=%llu\n",key);
mutex = semget(key,1,IPC_CREAT);//创建信号量 mutex = semget(key,1,IPC_CREAT);//创建信号量
printf("sem init, mutex=%d\n",mutex); // printf("sem init, mutex=%d\n",mutex);
if(mutex<=0){ if(mutex<=0){
printf("%d\n",errno); // printf("%d\n",errno);
} }
union semun set; union semun set;
set.val = 1;//钥匙数量为0 set.val = 1;//钥匙数量为0
@@ -138,7 +138,7 @@ void debug_log(const char *file,const char *fun,int line,int level,const char *f
#endif #endif
memcpy(log_buf,level_str[level],level_str_len[level]); memcpy(log_buf,level_str[level],level_str_len[level]);
length=level_str_len[level]; length=level_str_len[level];
length+=sprintf(log_buf + length,"%s|%s|%d| ",file,fun,line); length+=sprintf(log_buf + length,"%s:%d|%s| ",file,line,fun);
va_start(args, fmt); va_start(args, fmt);
length += vsnprintf(log_buf + length, CONSOLEBUF_SIZE - length - 3, fmt, args); length += vsnprintf(log_buf + length, CONSOLEBUF_SIZE - length - 3, fmt, args);

View File

@@ -9,7 +9,7 @@
/*r{ 修改日志打印等级 }c*/ /*r{ 修改日志打印等级 }c*/
#define DBG_LOG_LEVEL DBG_LEVEL_INFO #define DBG_LOG_LEVEL DBG_LEVEL_LOG

View File

@@ -6,7 +6,10 @@
#include "debug.h" #include "debug.h"
static void __mem_append_m(map_def **m,void *p);
static void __mem_append_m(map_def** m , void* p);
void __mem_clear(map_def **m){ void __mem_clear(map_def **m){
@@ -98,8 +101,8 @@ void *mem_malloc(size_t size){
return p; return p;
} }
void *mem_calloc(size_t memb_size,size_t memb_num){ void *mem_calloc(size_t memb_num, size_t memb_size){
void *p=calloc(memb_size,memb_num); void *p=calloc(memb_num, memb_size);
__mem_append(p); __mem_append(p);
return p; return p;
} }

View File

@@ -21,7 +21,7 @@ typedef struct _map_def{
void __mem_clear(map_def **m); void __mem_clear(map_def **m);
void __mem_mov(map_def **d,map_def **s); void __mem_mov(map_def **d,map_def **s);
void *mem_calloc(size_t memb_size,size_t memb_num); void *mem_calloc(size_t memb_num, size_t memb_size);
void *mem_malloc(size_t size); void *mem_malloc(size_t size);
void mem_free(void *p); void mem_free(void *p);