diff --git a/libs/lexer/include/scc_lexer.h b/libs/lexer/include/scc_lexer.h index c8c246f..787473a 100644 --- a/libs/lexer/include/scc_lexer.h +++ b/libs/lexer/include/scc_lexer.h @@ -6,13 +6,11 @@ #ifndef __SCC_LEXER_H__ #define __SCC_LEXER_H__ -#include "lexer_token.h" +#include "scc_lexer_token.h" #include #include #include -typedef SCC_RING(scc_lexer_tok_t) scc_lexer_tok_ring_t; -typedef SCC_VEC(scc_lexer_tok_t) scc_lexer_tok_vec_t; /** * @brief 词法分析器核心结构体 * diff --git a/libs/lexer/include/lexer_token.h b/libs/lexer/include/scc_lexer_token.h similarity index 97% rename from libs/lexer/include/lexer_token.h rename to libs/lexer/include/scc_lexer_token.h index d646574..6149123 100644 --- a/libs/lexer/include/lexer_token.h +++ b/libs/lexer/include/scc_lexer_token.h @@ -4,6 +4,12 @@ #include #include +#include +struct scc_lexer_token; +typedef struct scc_lexer_token scc_lexer_tok_t; +typedef SCC_RING(scc_lexer_tok_t) scc_lexer_tok_ring_t; +typedef SCC_VEC(scc_lexer_tok_t) scc_lexer_tok_vec_t; + typedef enum scc_cstd { SCC_CSTD_C89, SCC_CSTD_C99, @@ -82,6 +88,7 @@ typedef enum scc_cstd { X(blank , SCC_TOK_SUBTYPE_EMPTYSPACE, SCC_TOK_BLANK ) \ X(endline , SCC_TOK_SUBTYPE_EMPTYSPACE, SCC_TOK_ENDLINE ) \ X("#" , SCC_TOK_SUBTYPE_OPERATOR, SCC_TOK_SHARP ) \ + X("##" , SCC_TOK_SUBTYPE_OPERATOR, SCC_TOK_SHARP_SHARP ) \ X("==" , SCC_TOK_SUBTYPE_OPERATOR, SCC_TOK_EQ ) \ X("=" , SCC_TOK_SUBTYPE_OPERATOR, SCC_TOK_ASSIGN ) \ X("++" , SCC_TOK_SUBTYPE_OPERATOR, SCC_TOK_ADD_ADD ) \ @@ -166,18 +173,18 @@ typedef enum scc_tok_subtype { SCC_TOK_SUBTYPE_EOF // 结束标记 } scc_tok_subtype_t; -scc_tok_subtype_t scc_get_tok_subtype(scc_tok_type_t type); -const char *scc_get_tok_name(scc_tok_type_t type); - /** * @brief 词法分析结果 * @warning 需要手动释放lexeme否则会出现内存泄漏 */ -typedef struct scc_lexer_token { +struct scc_lexer_token { scc_tok_type_t type; scc_cstring_t lexeme; scc_pos_t loc; -} scc_lexer_tok_t; +}; + +scc_tok_subtype_t scc_get_tok_subtype(scc_tok_type_t type); +const char *scc_get_tok_name(scc_tok_type_t type); static inline void scc_lexer_tok_drop(scc_lexer_tok_t *tok) { scc_cstring_free(&tok->lexeme); diff --git a/libs/lexer/src/lexer.c b/libs/lexer/src/lexer.c index 3212195..9e228ee 100644 --- a/libs/lexer/src/lexer.c +++ b/libs/lexer/src/lexer.c @@ -88,7 +88,7 @@ static inline cbool next_char(scc_lexer_t *lexer, scc_cstring_t *lexeme, #define set_err_token(token) ((token)->type = SCC_TOK_UNKNOWN) void scc_lexer_get_token(scc_lexer_t *lexer, scc_lexer_tok_t *token) { - scc_sstream_char_t cur; + scc_sstream_char_t cur = {0}; scc_cstring_t lex = scc_cstring_create(); // 临时lexeme // 尝试预览第一个字符 @@ -439,7 +439,11 @@ void scc_lexer_get_token(scc_lexer_t *lexer, scc_lexer_tok_t *token) { token->type = SCC_TOK_COND; break; case '#': - token->type = SCC_TOK_SHARP; + if (next.character == '#') { + token->type = SCC_TOK_SHARP_SHARP; + next_char(lexer, &lex, &cur); + } else + token->type = SCC_TOK_SHARP; break; default: token->type = SCC_TOK_UNKNOWN; diff --git a/libs/lexer/src/token.c b/libs/lexer/src/token.c index 947295d..f7689c3 100644 --- a/libs/lexer/src/token.c +++ b/libs/lexer/src/token.c @@ -1,4 +1,4 @@ -#include +#include // 生成字符串映射(根据需求选择#str或#name) static const char *token_strings[] = { diff --git a/runtime/scc_core/include/scc_core_ring.h b/runtime/scc_core/include/scc_core_ring.h index a2fd2c1..4dc1511 100644 --- a/runtime/scc_core/include/scc_core_ring.h +++ b/runtime/scc_core/include/scc_core_ring.h @@ -51,7 +51,8 @@ break; \ } \ usize phys_tail = scc_ring_phys(ring, (ring).tail); \ - if (!(ring).fill(&(ring).data[phys_tail], (ring).userdata)) { \ + if ((ring).fill == null || \ + !(ring).fill(&(ring).data[phys_tail], (ring).userdata)) { \ ok = 0; \ break; \ } \ @@ -79,6 +80,17 @@ (ring).userdata = (_userdata); \ } while (0) +#define scc_ring_by_buffer(ring, buffer, size) \ + do { \ + (ring).data = (buffer); \ + (ring).cap = (size); \ + (ring).head = 0; \ + (ring).probe = 0; \ + (ring).tail = (size); \ + (ring).fill = null; \ + (ring).userdata = null; \ + } while (0) + /** * @brief 释放环形缓冲区内存 * @param ring 环形缓冲区变量 diff --git a/runtime/scc_core/include/scc_core_str.h b/runtime/scc_core/include/scc_core_str.h index 62ac199..7f57b64 100644 --- a/runtime/scc_core/include/scc_core_str.h +++ b/runtime/scc_core/include/scc_core_str.h @@ -194,6 +194,11 @@ static inline char *scc_cstring_as_cstr(const scc_cstring_t *str) { return str->data; } +static inline int scc_cstring_cmp(const scc_cstring_t *str1, + const scc_cstring_t *str2) { + return scc_strcmp(scc_cstring_as_cstr(str1), scc_cstring_as_cstr(str2)); +} + static inline char *scc_cstring_move_cstr(scc_cstring_t *str) { if (str == null || str->data == null) { return null;