Reputation: 16724
I'm reading this C BNF grammar. I have the following questions:
<declarator>
job to parse this syntax: id(int a, int b)
(in <direct-declarator>
) and so on to arrays in parameters of a function prototype/definition, etc;<function-definition>
, why is <declarator>
followed by a {<declaration>}*
?
from what I understood, it could make valid a type name or storage class followed by a function header like id(int a, int b) int
. But I'm sure it isn't valid in C. What am I missing?Upvotes: 1
Views: 2778
Reputation: 241721
Yes, <declarator>
in that grammar is the name of the object being declared, plus its arguments or array size (and also the pointer qualifiers of its type). <declarator>
does not include the base type (return type for a function; element type for an array).
Note that there are two alternatives in <direct-declarator>
, both of which seem relevant to functions:
<direct-declarator> ( <parameter-type-list> )
<direct-declarator> ( {<identifier>}* )
The first of these is what we normally think of as a function declaration, where the parameters are types or types-with-parameter-name. The second one is just a list of identifiers. (It should, I think, be a comma-separated list of identifiers.) The second case is the old-style "K&R" function definition syntax, which you may never have seen before, and should immediately forget about after reading this answer because -- while C compilers still accept it -- it has been deprecated for not just years, but decades. So don't use it. For historical completeness, here's how it looked:
int foo(n, p)
int n;
char p;
{
/ Body of the function */
}
Upvotes: 4