You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ANTLR4的C11语法解析合法可编译C代码时出现输入不匹配错误的问题咨询

ANTLR4的C11语法解析合法可编译C代码时出现输入不匹配错误的问题咨询

我最近用Kotlin结合ANTLR4开发工具,用的是Sam Harwell写的C11语法规则,之前一直运行得顺顺利利,工具和语法都没出过岔子。但突然碰到个棘手的情况:有一段C代码用当下的编译器编译完全没问题,可ANTLR4的解析器却抛出了输入不匹配的错误。

先给大家看我简化后的出问题C代码:

int main(int argc,char **argv) {
    void asm_something();
    while (1) {
        if (!--argc) {
            break;
        } else ++argv;
        break;
    }
    return 1;
}

解析器报的错误信息如下:

line 8:6 mismatched input 'else' expecting {'__stdcall', '__cdecl', '__clrcall', '__fastcall', '__thiscall', '__vectorcall', '(', '*', '^', ';', Identifier}
line 12:2 mismatched input 'return' expecting {'__extension__', '__builtin_va_arg', '__builtin_offsetof', '__m128', '__m128d', '__m128i', '__typeof__', '__inline__', '__stdcall', '__declspec', '__asm', '__attribute__', '__asm__', 'auto', 'break', 'case', 'char', 'const', 'continue', 'default', 'do', 'double', 'enum', 'extern', 'float', 'for', 'goto', 'if', 'inline', 'int', 'long', 'register', 'restrict', 'return', 'short', 'signed', 'sizeof', 'static', 'struct', 'switch', 'typedef', 'union', 'unsigned', 'void', 'volatile', 'while', '_Alignas', '_Alignof', '_Atomic', '_Bool', '_Complex', '_Generic', '_Noreturn', '_Static_assert', '_Thread_local', '(', '{', '}', '+', '++', '-', '--', '*', '&', '&&', '!', '~', ';', Identifier, Constant, DigitSequence, StringLiteral}

我自己排查了半天,发现只要把asm_something的函数声明改成别的(比如foo_something),解析器就完全正常了——也就是说问题根源在函数名以asm开头这件事上?

可是按照C11标准,以asm开头的标识符应该是合法的吧?毕竟现代编译器都能正常编译这段代码。我感觉问题应该出在我用的那个ANTLR4的C11语法定义里,所以暂时没贴工具的代码,先想搞清楚语法层面的问题。有没有大佬遇到过类似情况,或者能帮我分析下原因?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:30:38