feat(argparse): 添加命令行参数约束和错误处理功能

- 添加了命令行参数约束相关数据结构定义
- 新增错误上下文字段用于更好的错误提示
- 实现了参数验证功能,包括必需参数检查和值选择验证
- 改进错误处理流程,支持添加帮助信息和使用说明
- 优化调试输出格式,增加更多错误场景的处理

fix(parser): 修复语义分析器资源释放问题

- 在scc_sema_drop函数中添加空指针检查,避免空指针释放导致崩溃

refactor(dump): 重构AST节点转储实现

- 将树形转储上下文重构为更简洁的数据结构
- 修改转储回调函数签名以支持更好的缓冲区管理
- 优化内存拷贝操作,提高转储性能

style(amd64): 移除未使用的变量声明

- 删除scc_mcode_amd64_mov_r64_m64_sib函数中未使用的disp8变量
This commit is contained in:
zzy
2026-04-11 11:42:31 +08:00
parent 053c6abf51
commit 630e22b73b
9 changed files with 136 additions and 99 deletions

View File

@@ -12,6 +12,7 @@ enum {
ARGPARSE_SHOW_CMD,
ARGPARSE_SHOW_HELP_MSG,
ARGPRASE_USING_HELP_HINT,
ARGPARSE_UNKNOWN_ARGUMENT,
ARGPARSE_INVALID_VALUE_FOR_OPTION,
ARGPARSE_OPTION_MISSING_VALUE,
@@ -28,10 +29,12 @@ static const char *fmt_en[] = {
[ARGPARSE_SHOW_CMD] = "Commands:\n",
[ARGPARSE_SHOW_HELP_MSG] = "Show this help message and exit",
[ARGPARSE_UNKNOWN_ARGUMENT] = "Unknown argument '%s'",
[ARGPRASE_USING_HELP_HINT] =
"Using '-h' or '--help' to get more information\n",
[ARGPARSE_UNKNOWN_ARGUMENT] = "Unknown argument '%s'\n",
[ARGPARSE_INVALID_VALUE_FOR_OPTION] = "Invalid value for option '%s'\n",
[ARGPARSE_OPTION_MISSING_VALUE] = "Option '%s' missing value\n",
[ARGPARSE_DID_YOU_MEAN] = "; Did you mean: '%s'?\n",
[ARGPARSE_DID_YOU_MEAN] = "Did you mean: '%s'?\n",
};
static const char *fmt_zh[] = {
@@ -44,10 +47,11 @@ static const char *fmt_zh[] = {
[ARGPARSE_SHOW_CMD] = "命令:\n",
[ARGPARSE_SHOW_HELP_MSG] = "显示帮助信息并退出",
[ARGPARSE_UNKNOWN_ARGUMENT] = "未知的参数 '%s'",
[ARGPRASE_USING_HELP_HINT] = "使用 '-h' 或者 '--help' 获取更多信息\n",
[ARGPARSE_UNKNOWN_ARGUMENT] = "未知的参数 '%s'\n",
[ARGPARSE_INVALID_VALUE_FOR_OPTION] = "无效的选项值 '%s'\n",
[ARGPARSE_OPTION_MISSING_VALUE] = "选项 '%s' 缺少值\n",
[ARGPARSE_DID_YOU_MEAN] = "; 您是不是想要输入: '%s'?\n",
[ARGPARSE_DID_YOU_MEAN] = "您是不是想要输入: '%s'?\n",
};
/**
@@ -95,7 +99,7 @@ static int scc_levenshtein(const char *s1, const char *s2) {
return dist;
}
void scc_argparse_print_help(scc_argparse_t *parser, scc_argparse_cmd_t *cmd) {
static void print_usage(scc_argparse_t *parser, scc_argparse_cmd_t *cmd) {
const char **lines =
(parser->lang == SCC_ARGPARSE_LANG_ZH) ? fmt_zh : fmt_en;
scc_printf(lines[ARGPARSE_USAGE],
@@ -109,6 +113,14 @@ void scc_argparse_print_help(scc_argparse_t *parser, scc_argparse_cmd_t *cmd) {
if (scc_vec_size(cmd->subcmds) > 0)
scc_printf(lines[ARGPARSE_COMMAND]);
scc_printf("\n\n");
}
void scc_argparse_print_help(scc_argparse_t *parser, scc_argparse_cmd_t *cmd) {
const char **lines =
(parser->lang == SCC_ARGPARSE_LANG_ZH) ? fmt_zh : fmt_en;
print_usage(parser, cmd);
if (cmd->description)
scc_printf("%s\n\n", cmd->description);
@@ -197,28 +209,40 @@ const char *scc_argparse_find_similar_arg(scc_argparse_cmd_t *cmd,
}
void scc_argparse_print_error(scc_argparse_context_t *ctx,
scc_argparse_err_t err) {
const char **lines = (ctx->lang == SCC_ARGPARSE_LANG_ZH) ? fmt_zh : fmt_en;
const char *optname = ctx->result.raw_arg;
scc_argparse_t *parser, scc_argparse_err_t err) {
const char **lines =
(parser->lang == SCC_ARGPARSE_LANG_ZH) ? fmt_zh : fmt_en;
switch (err) {
case SCC_ARGPARSE_ERR_INVALID_ARG:
case SCC_ARGPARSE_ERR_INVALID_VALUE:
scc_printf(lines[ARGPARSE_INVALID_VALUE_FOR_OPTION], optname);
scc_printf(lines[ARGPARSE_INVALID_VALUE_FOR_OPTION], ctx->err_ctx);
break;
case SCC_ARGPARSE_ERR_MISSING_ARG:
case SCC_ARGPARSE_ERR_MISSING_VALUE:
scc_printf(lines[ARGPARSE_OPTION_MISSING_VALUE], optname);
scc_printf(lines[ARGPARSE_OPTION_MISSING_VALUE], ctx->err_ctx);
break;
case SCC_ARGPARSE_ERR_UNKNOWN_ARG:
case SCC_ARGPARSE_ERR_UNKNOWN_VALUE:
scc_printf(lines[ARGPARSE_UNKNOWN_ARGUMENT], optname);
const char *similar_arg =
scc_argparse_find_similar_arg(ctx->current_cmd, optname);
scc_printf(lines[ARGPARSE_UNKNOWN_ARGUMENT], ctx->result.raw_arg);
const char *similar_arg = scc_argparse_find_similar_arg(
ctx->current_cmd, ctx->result.raw_arg);
if (similar_arg != 0) {
scc_printf(lines[ARGPARSE_DID_YOU_MEAN], similar_arg);
}
break;
// FACK ERROR
case SCC_ARGPARSE_ERR_PNT_DEFAULT:
return;
default:
scc_printf("Unknown error: %d\n", err);
break;
}
if (parser->need_help) {
scc_printf(lines[ARGPRASE_USING_HELP_HINT]);
}
if (parser->need_error_add_help) {
scc_argparse_print_help(parser, ctx->current_cmd);
} else if (parser->need_error_add_usage) {
print_usage(parser, ctx->current_cmd);
}
}