我对著名的巴科斯-瑙尔形式的 C 语法感兴趣并研究了一段时间,令我困惑的是,有些语法在我看来是错误的,但根据 BNF 被认为是正确的。
例如,int test {}
这是什么?我认为这是 C 中的错误语法,但事实是 BNF 认为这是一个函数定义:
int -> type_const -> type_spec -> decl_specs
test-> id -> direct_declarator -> declarator
'{' '}' -> compound_stat
decl_specs declarator compound_stat -> function_definition
我用野牛试过这个,它认为输入int test {}
是正确的形式,但我在 C 编译器上试过,它不会编译。
所以有问题:
int test {}
语法是否正确?- 如果它是正确的语法,那是什么意思,为什么编译器不能识别它?
- 如果它是一个错误的语法,我能说 BNF 不严谨吗?这是否意味着现代 C 编译器不坚持这个 BNF?