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
相关产品推荐
相关产品推荐

