BNF C语法中的函数定义

时间:2014-06-22 03:40:03

标签: c compiler-construction grammar bnf

我正在阅读this C BNF语法。我有以下问题:

  1. 解析这种语法的<declarator>作业是正确的:id(int a, int b)(在<direct-declarator>中)依此类推到函数原型/定义等参数中的数组;
  2. <function-definition>中,为什么<declarator>后跟{<declaration>}*? 根据我的理解,它可以使类型名称或存储类有效,后跟像id(int a, int b) int这样的函数头。但我确信它在C中无效。我错过了什么?

1 个答案:

答案 0 :(得分:4)

  1. 是的,该语法中的<declarator>是要声明的对象的名称,加上其参数或数组大小(以及其类型的指针限定符)。 <declarator>不包括基类型(函数的返回类型;数组的元素类型)。

  2. 请注意,<direct-declarator>中有两个备选方案,它们似乎都与函数相关: <direct-declarator> ( <parameter-type-list> ) <direct-declarator> ( {<identifier>}* ) 第一个是我们通常认为的函数声明,其中参数是types或types-with-parameter-name。第二个只是一个标识符列表。 (我认为它应该是一个以逗号分隔的标识符列表。)第二种情况是旧式&#34; K&amp; R&#34;函数定义语法,你可能以前从未见过,并且应该在阅读这个答案之后立即忘记,因为 - 虽然C编译器仍然接受它 - 它已经被弃用了不仅仅是几年,而是几十年。所以不要使用它。为了历史的完整性,请查看它的外观: int foo(n, p) int n; char p; { / Body of the function */ }