feat(lexer): 添加预处理器关键字支持并优化词法分析器
添加了完整的C预处理器关键字表,包括define、include、ifdef等关键字, 用于支持预处理器功能。 - 新增SCC_PPKEYWORD_TABLE宏定义所有预处理器关键字 - 在token类型枚举中包含预处理关键字 - 重构词法分析器以正确识别预处理关键字 - 添加scc_lexer_tok_drop函数用于清理token资源 refactor(lexer): 重构词法分析器内部结构 - 修复keywords数组字段名从tok到tok_type - 优化scc_lexer_get_valid_token使用while循环替代do-while - 修改fill_token和fill_valid_token返回类型为cbool - 调整lexer_to_ring参数语义更清晰 fix(sstream): 修正环形缓冲区填充函数返回类型 - 将fill_func返回类型从int改为cbool以保持一致性 - 更新SCC_RING宏文档说明fill回调函数返回值含义 docs(argparse): 重命名examples目录修复路径错误 - 将libs/argparse/example重命名为libs/argparse/examples保持一致性 test(lexer): 更新测试用例适配新的流接口 - 修改测试代码中的scc_sstream_ref_ring为scc_sstream_to_ring - 确保测试用例与新的API保持兼容 style(lexer): 更新示例程序日志级别和实现方式 - 将调试日志改为信息日志 - 使用环形缓冲区实现示例程序的token获取
This commit is contained in:
112
libs/argparse/examples/main.c
Normal file
112
libs/argparse/examples/main.c
Normal file
@@ -0,0 +1,112 @@
|
||||
#include <argparse.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
int verbose; // -v, --verbose
|
||||
const char *output; // -o, --output
|
||||
const char *config; // --config
|
||||
const char *input; // input argument
|
||||
const char *output_dir; // output_dir argument
|
||||
cbool force; // -f, --force (for subcommand)
|
||||
const char *path; // path argument (for subcommand)
|
||||
} parsed_args_t;
|
||||
|
||||
int main(int argc, const char **argv, const char **envp) {
|
||||
#ifdef _WIN32
|
||||
SetConsoleOutputCP(CP_UTF8);
|
||||
SetConsoleCP(CP_UTF8);
|
||||
#endif
|
||||
|
||||
// 初始化解析结果结构体
|
||||
parsed_args_t parsed = {0};
|
||||
parsed.output = "a.out"; // 默认值
|
||||
parsed.output_dir = "."; // 默认值
|
||||
parsed.path = "."; // 默认值
|
||||
|
||||
// 初始化 argparse
|
||||
scc_argparse_t argparse;
|
||||
scc_argparse_init(&argparse, "demo", "一个命令行参数解析演示工具");
|
||||
argparse.need_debug = true;
|
||||
argparse.lang = SCC_ARGPARSE_LANG_ZH; // 中文帮助
|
||||
|
||||
scc_argparse_cmd_t *root = scc_argparse_get_root(&argparse);
|
||||
|
||||
// ---------- 添加选项 ----------
|
||||
// 1. --verbose / -v (计数)
|
||||
scc_argparse_opt_t verbose;
|
||||
scc_argparse_opt_init(&verbose, 'v', "verbose",
|
||||
"增加详细程度(可多次使用)");
|
||||
scc_argparse_spec_setup_count(&verbose.spec, &parsed.verbose);
|
||||
scc_argparse_cmd_add_opt(root, &verbose);
|
||||
|
||||
// 2. --output / -o (字符串)
|
||||
scc_argparse_opt_t output;
|
||||
scc_argparse_opt_init(&output, 'o', "output", "输出文件路径");
|
||||
scc_argparse_spec_setup_string(&output.spec, &parsed.output);
|
||||
scc_argparse_cmd_add_opt(root, &output);
|
||||
|
||||
// 3. --config (字符串)
|
||||
scc_argparse_opt_t config;
|
||||
scc_argparse_opt_init(&config, 0, "config", "配置文件路径");
|
||||
scc_argparse_spec_setup_string(&config.spec, &parsed.config);
|
||||
scc_argparse_cmd_add_opt(root, &config);
|
||||
|
||||
// ---------- 添加位置参数 ----------
|
||||
// 必需参数: input
|
||||
scc_argparse_arg_t input;
|
||||
scc_argparse_arg_init(&input, "input", "输入文件");
|
||||
scc_argparse_spec_setup_string(&input.spec, &parsed.input);
|
||||
scc_argparse_spec_set_required(&input.spec, true);
|
||||
scc_argparse_cmd_add_arg(root, &input);
|
||||
|
||||
// 可选参数: output_dir
|
||||
scc_argparse_arg_t output_dir;
|
||||
scc_argparse_arg_init(&output_dir, "output_dir", "输出目录");
|
||||
scc_argparse_spec_setup_string(&output_dir.spec, &parsed.output_dir);
|
||||
scc_argparse_spec_set_required(&output_dir.spec, false);
|
||||
scc_argparse_cmd_add_arg(root, &output_dir);
|
||||
|
||||
// ---------- 子命令 init ----------
|
||||
scc_argparse_cmd_t init_cmd;
|
||||
scc_argparse_cmd_init(&init_cmd, "init", "初始化仓库");
|
||||
|
||||
// 子命令选项: --force / -f
|
||||
scc_argparse_opt_t force;
|
||||
scc_argparse_opt_init(&force, 'f', "force", "强制覆盖");
|
||||
scc_argparse_spec_setup_bool(&force.spec, &parsed.force);
|
||||
scc_argparse_cmd_add_opt(&init_cmd, &force);
|
||||
|
||||
// 子命令位置参数: path (可选)
|
||||
scc_argparse_arg_t path;
|
||||
scc_argparse_arg_init(&path, "path", "初始化路径");
|
||||
scc_argparse_spec_setup_string(&path.spec, &parsed.path);
|
||||
scc_argparse_spec_set_required(&path.spec, false);
|
||||
scc_argparse_cmd_add_arg(&init_cmd, &path);
|
||||
|
||||
// 将子命令加入根命令
|
||||
scc_argparse_cmd_add_subcmd(root, &init_cmd);
|
||||
|
||||
// 解析参数
|
||||
int ret = scc_argparse_parse(&argparse, argc, argv);
|
||||
|
||||
// 打印解析结果
|
||||
if (ret == 0) {
|
||||
scc_printf("\n解析成功\n");
|
||||
scc_printf("解析到的参数和选项:\n");
|
||||
scc_printf(" verbose: %d\n", parsed.verbose);
|
||||
scc_printf(" output: %s\n", parsed.output);
|
||||
scc_printf(" config: %s\n",
|
||||
parsed.config ? parsed.config : "(未指定)");
|
||||
scc_printf(" input: %s\n", parsed.input);
|
||||
scc_printf(" output_dir: %s\n", parsed.output_dir);
|
||||
scc_printf(" force: %s\n", parsed.force ? "true" : "false");
|
||||
scc_printf(" path: %s\n", parsed.path);
|
||||
}
|
||||
|
||||
scc_argparse_drop(&argparse);
|
||||
return ret;
|
||||
}
|
||||
Reference in New Issue
Block a user