B - Reference Manual for the Objective-C Language#
This appendix presents a formal grammar for the Objective-C extensions to the C language–as the Objective-C language is implemented for the OPENSTEP development environment. It adds to the grammar for ANSI standard C found in Appendix A of The C Programming Language (second edition, 1988) by Brian W. Kernighan and Dennis M. Ritchie, published by Prentice Hall, and should be read in conjunction with that book.
The Objective-C extensions introduce some new symbols (such as class-interface), but also make use of symbols (such as function-definition) that are explained in the standard C grammar. The symbols mentioned but not explained here are listed below:
Undefined Symbols#
compound statement
constant
declaration
declaration-list
enum-specifier
expression
function-definition
identifier
parameter-type-list
string
struct-declaration-list
struct-or-union
typedef-name
type-name
Of these, identifier and string are undefined terminal symbols. Objective-C adds no undefined terminal symbols of its own.
Two notational conventions used here differ from those used in The C Programming Language:
Literal symbols are shown in bold type.
Brackets enclose optional elements and are in italic type. Literal brackets, like other literal symbols, are non-italic and bold.
Otherwise, this appendix follows the conventions of the C reference manual. Each part of the grammar consists of a symbol followed by a colon and an indented list of mutually-exclusive possibilities for expanding the symbol. For example:
receiver:
expression
class-name
super
However, there is an exception: Even though they’re not mutually exclusive, the constituents of classes, categories, and protocols are listed on separate lines to clearly show the ordering of elements. For example:
protocol-declaration:
@protocol protocol-name
[protocol-reference-list]
[interface-declaration-list]
@end
This exception to the general rule is easily recognized since each list terminates with @end.
There are just four entry points where the Objective-C language modifies the rules defined for standard C:
External declarations
Type specifiers
Type qualifiers
Primary expressions
This appendix is therefore divided into four sections corresponding to these points. Where a rule in the standard C grammar is modified by an Objective-C extension, the entire rule is repeated in its modified form.
External Declarations#
*external-declaration:
*function-definition
*declaration
*class-interface
*class-implementation
*category-interface
*category-implementation
*protocol-declaration
class-declaration-list
*class-interface:
@interface class-name [ : superclass-name *]
[ protocol-reference-list *]
[ instance-variables *]
[ interface-declaration-list *]
@end
*class-implementation:
@implementation class-name [ : superclass-name *]
[ instance-variables *]
[ implementation-definition-list *]
@end
*category-interface:
@interface class-name ( category-name **)
** [ protocol-reference-list *][ interface-declaration-list *]
@end
*category-implementation:
@implementation class-name ( category-name **)
** [ implementation-definition-list *]@end
*protocol-declaration:
@protocol *protocol-name
[ protocol-reference-list *]
[ interface-declaration-list *]
@end
*class-declaration-list:
@class class-list ;
*class-list:
*class-name
class-list , class-name
*protocol-reference-list:
< protocol-list >
*protocol-list:
*protocol-name
protocol-list , protocol-name
*class-name:
identifier
*superclass-name:
identifier
*category-name:
identifier
*protocol-name:
identifier
*instance-variables:
{ [ visibility-specification ] struct-declaration-list [ instance-variables ] }
*visibility-specification:
@private
@protected
@public
*interface-declaration-list:
*declaration
*method-declaration
interface-declaration-list *declaration
interface-declaration-list method-declaration
*method-declaration:
*class-method-declaration
instance-method-declaration
*class-method-declaration:
+ [ method-type ] method-selector ;
*instance-method-declaration:
- [ method-type ] method-selector ;
*implementation-definition-list:
*function-definition
*declaration
*method-definition
implementation-definition-list *function-definition
implementation-definition-list *declaration
implementation-definition-list method-definition
*method-definition:
*class-method-definition
instance-method-definition
*class-method-definition:
+ [ method-type ] method-selector [ declaration-list ] compound-statement
*instance-method-definition:
- [ method-type ] method-selector [ declaration-list ] compound-statement
*method-selector:
*unary-selector
keyword-selector [ , … *]
keyword-selector [ , parameter-type-list ]
*unary-selector:
selector
*keyword-selector:
*keyword-declarator
keyword-selector keyword-declarator
*keyword-declarator:
: [ method-type ] *identifier
selector : [ method-type ] identifier
*selector:
identifier
*method-type:
( type-name )
Type Specifiers#
*type-specifier:
void
char
short
int
long
float
double
signed
unsigned
id [ protocol-reference-list *]class-name [ protocol-reference-list *]
*struct-or-union-specifier
*enum-specifier
typedef-name
*struct-or-union-specifier:
struct-or-union [ identifier ] { struct-declaration-list **}
** struct-or-union [ identifier ] { @defs ( class-name **) }
** struct-or-union identifier
Type Qualifiers#
*type-qualifier:
**const
volatile
** protocol-qualifier
*protocol-qualifier:
**in
out
inout
bycopy
byref
** oneway
Primary Expressions#
*primary-expression:
*identifier
*constant
*string
( expression **)
** **self
** *message-expression*selector-expression
*protocol-expression
encode-expression
*message-expression:
[ receiver message-selector ]
*receiver:
*expression
*class-name
super
*message-selector:
*selector
keyword-argument-list
*keyword-argument-list:
*keyword-argument
keyword-argument-list keyword-argument
*keyword-argument:
selector : *expression
: expression
*selector-expression:
@selector ( selector-name )
*selector-name:
*selector
keyword-name-list
*keyword-name-list:
*keyword-name
keyword-name-list keyword-name
*keyword-name:
selector **:
** :
*protocol-expression:
@protocol ( protocol-name )
*encode-expression:
@encode ( type-name )
Last Modified: 03:52pm , January 13, 1996
Hot News | OpenStep | WebObjects | Services | Buy Now | NeXTanswers | Search | About NeXT
NeXT sales and product information inquiries? Click here
Copyright 1996 NeXT Software, Inc. Proprietary Notices.