cdecl - Compose C declarations
Cdecl is a program for encoding and decoding C type-declarations. It
reads standard input for statements in the language described below.
The results are written on standard output.
Cdecl's scope is intentionally small. It doesn't help you figure out
storage classes or initializations.
There are four statements in the language. The "declare" statement
composes a C type-declaration from a verbose description. The "cast"
statement composes a C type-cast as might appear in an expression. The
"explain" statement decodes a C type-declaration, producing a verbose
description. The "help" statement describes the others.
The following grammar describes the language. In the grammar, words in
"<>" are non-terminals, bare lower-case words are terminals that stand
for themselves. Bare upper-case words are other lexical tokens: NOTH-
ING means the empty string; NAME means a C identifier; NUMBER means a
string of decimal digits; and NL means the new-line character.
<program> ::= NOTHING
| <program> <stat> NL
<stat> ::= NOTHING
| declare NAME as <decl>
| cast NAME into <decl>
| explain <cdecl>
<decl> ::= array of <decl>
| array NUMBER of <decl>
| function returning <decl>
| function ( NAME ) returning <decl>
| pointer to <decl>
<cdecl> ::= <cdecl1>
| * <cdecl>
<cdecl1> ::= <cdecl1> ( )
| <cdecl1> [ ]
| <cdecl1> [ NUMBER ]
| ( <cdecl> )
<type> ::= <typename> | <modlist>
| <modlist> <typename>
| struct NAME | union NAME | enum NAME
<typename> ::= int | char | double | float
<modlist> ::= <modifier> | <modlist> <modifier>
<modifier> ::= short | long | unsigned
To declare an array of pointers to functions like malloc(3), do declare
fptab as array of pointer to function returning pointer to char The
result of this command is char *(*fptab)() When you see this declara-
tion in someone else's code, you can make sense out of it by doing
explain char *(*fptab)() The proper declaration for signal(2) cannot
be described in cdecl's language (it can't be described in C either).
An adequate declaration for most purposes is given by declare signal as
function returning pointer to function returning int The function dec-
laration that results has two sets of empty parentheses. The author of
such a function might wonder where the parameters go. declare signal
as function (args) returning pointer to function returning int provides
the solution: int (*signal(args))()
The declare statement tries to point out constructions that are not
supported in C. Also, certain non-portable constructs are flagged.
Syntax errors cause the parser to play dead until a newline is read.
The pseudo-English syntax is excessively verbose.
Section 8.4 of the C Reference Manual.
indent(1), cb(1), yacc(1), lex(1), bison(1L), intro(3), intro(2)
COMMAND LANGUAGE |