fix(pproc): 修复预处理器对空行的处理逻辑

- 移除了错误的ENDLINE类型提前返回逻辑
- 将ENDLINE类型的处理移到正确的位置
- 添加了针对条件编译中空行的测试用例

fix(cli): 更新include路径参数的帮助文本

- 修正英文帮助文本为"Add directory to the include search paths"
- 修正中文帮助文本为"添加系统头文件到搜索路径"
This commit is contained in:
zzy
2026-02-26 10:52:32 +08:00
parent f56b13da2c
commit 13de9d713b
3 changed files with 25 additions and 8 deletions

View File

@@ -20,11 +20,6 @@ CONTINUE:
if (ok == false) { if (ok == false) {
return false; return false;
} }
if (tok.type == SCC_TOK_ENDLINE) {
scc_ring_next_consume(*stream, *out, ok);
pp->at_line_start = true;
return true;
}
if (pp->at_line_start) { if (pp->at_line_start) {
if (tok.type == SCC_TOK_SHARP) { if (tok.type == SCC_TOK_SHARP) {
@@ -51,7 +46,11 @@ CONTINUE:
goto CONTINUE; goto CONTINUE;
} }
if (tok.type == SCC_TOK_IDENT) { if (tok.type == SCC_TOK_ENDLINE) {
scc_ring_next_consume(*stream, *out, ok);
pp->at_line_start = true;
return true;
} else if (tok.type == SCC_TOK_IDENT) {
// maybe expanded // maybe expanded
scc_pproc_macro_t *macro = scc_pproc_macro_t *macro =
scc_pproc_macro_table_get(&pp->macro_table, &tok.lexeme); scc_pproc_macro_table_get(&pp->macro_table, &tok.lexeme);

View File

@@ -273,6 +273,24 @@ static void test_conditional_ifdef(void) {
"#endif\n", "#endif\n",
"foo\n"); "foo\n");
CHECK_PP_OUTPUT_EXACT("#ifdef FOO\n"
"\n"
"#endif\n",
"");
CHECK_PP_OUTPUT_EXACT("#ifdef FOO\n"
"#endif\n",
"");
CHECK_PP_OUTPUT_EXACT("#ifndef FOO\n"
"\n"
"#endif\n",
"\n");
CHECK_PP_OUTPUT_EXACT("#ifndef FOO\n"
"#endif\n",
"");
// ifdef + else // ifdef + else
CHECK_PP_OUTPUT_EXACT("#define FOO\n" CHECK_PP_OUTPUT_EXACT("#define FOO\n"
"#ifdef FOO\n" "#ifdef FOO\n"

View File

@@ -38,7 +38,7 @@ static void setup_argparse(scc_argparse_t *argparse, scc_config_t *config,
[SCC_HINT_DESCRIPTION] = "A simple C compiler", [SCC_HINT_DESCRIPTION] = "A simple C compiler",
[SCC_HINT_OUTPUT_FILE] = "Output file", [SCC_HINT_OUTPUT_FILE] = "Output file",
[SCC_HINT_INPUT_FILE] = "Input source file", [SCC_HINT_INPUT_FILE] = "Input source file",
[SCC_HINT_INCLUDE_PATH] = "SCC_HINT_INCLUDE_PATH", [SCC_HINT_INCLUDE_PATH] = "Add directory to the include search paths",
[SCC_HINT_VERBOSE] = "Increase verbosity (can be used multiple times)", [SCC_HINT_VERBOSE] = "Increase verbosity (can be used multiple times)",
[SCC_HINT_EMIT_LEX] = "Generate lexer sources tokens and exit", [SCC_HINT_EMIT_LEX] = "Generate lexer sources tokens and exit",
[SCC_HINT_EMIT_PP] = "Generate preprocessed tokens and exit", [SCC_HINT_EMIT_PP] = "Generate preprocessed tokens and exit",
@@ -50,7 +50,7 @@ static void setup_argparse(scc_argparse_t *argparse, scc_config_t *config,
[SCC_HINT_DESCRIPTION] = "一个简单的C编译器", [SCC_HINT_DESCRIPTION] = "一个简单的C编译器",
[SCC_HINT_OUTPUT_FILE] = "输出文件", [SCC_HINT_OUTPUT_FILE] = "输出文件",
[SCC_HINT_INPUT_FILE] = "输入源文件", [SCC_HINT_INPUT_FILE] = "输入源文件",
[SCC_HINT_INCLUDE_PATH] = "SCC_HINT_INCLUDE_PATH", [SCC_HINT_INCLUDE_PATH] = "添加系统头文件到搜索路径",
[SCC_HINT_VERBOSE] = "增加详细输出(可多次使用)", [SCC_HINT_VERBOSE] = "增加详细输出(可多次使用)",
[SCC_HINT_EMIT_LEX] = "生成`源代码的词法单元`并退出", [SCC_HINT_EMIT_LEX] = "生成`源代码的词法单元`并退出",
[SCC_HINT_EMIT_PP] = "生成`预处理后的词法单元`并退出", [SCC_HINT_EMIT_PP] = "生成`预处理后的词法单元`并退出",