Interdata_v6/usr/doc/cman/cman6
.if n .ds * *
.bp
.SH
16. Grammar revisited.
.PP
This section repeats the grammar of C
in notation somewhat different than
given before.
The description below is adapted directly from a YACC grammar
actually used by several compilers;
thus it may (aside from possible editing errors)
be regarded as authentic.
The notation is pure YACC with the exception that
the `\(or' separating alternatives for a production
is omitted, since alternatives are always on separate lines;
the `;' separating productions is omitted since
a blank line is left between productions.
.PP
The lines with `%term' name the terminal symbols,
which are either commented upon or should be self-evident.
The lines with `%left,' `%right,' and `%binary'
indicate whether the listed terminals are left-associative,
right-associative, or non-associative,
and describe a precedence structure.
The precedence (binding strength)
increases as one reads down the page.
When the construction `%prec \fIx\fR'
appears
the precedence of the rule is that of the terminal
.It x;
otherwise
the precedence of the rule is that of its leftmost terminal.
.TS
l1l1l1l1.
%term NAME
%term STRING
%term ICON
%term FCON
%term PLUS
%term MINUS
%term MUL
%term AND
%term QUEST
%term COLON
%term ANDAND
%term OROR
%term ASOP /\** old-style =+ etc. \**/
%term RELOP /\** <= >= < > \**/
%term EQUOP /\** == != \**/
%term DIVOP /\** / % \**/
%term OR /\** \(or \**/
%term EXOR /\** \*^ \**/
%term SHIFTOP /\** << >> \**/
%term INCOP /\** ++ \-\- \**/
%term UNOP /\** ! \*~ \**/
%term STROP /\** \fG.\fR \-> \**/
.TE
.TS
l1l1l1l1.
%term TYPE /\** int, char, long, float, double, unsigned, short \**/
%term CLASS /\** extern, register, auto, static, typedef \**/
%term STRUCT /\** struct or union \**/
%term RETURN
%term GOTO
%term IF
%term ELSE
%term SWITCH
%term BREAK
%term CONTINUE
%term WHILE
%term DO
%term FOR
%term DEFAULT
%term CASE
%term SIZEOF
%term LP /\** ( \**/
%term RP /\** ) \**/
%term LC /\** { \**/
%term RC /\** } \**/
%term LB /\** [ \**/
%term RB /\** ] \**/
%term CM /\** , \**/
%term SM /\** ; \**/
%term ASSIGN /\** = \**/
.TE
.TS
l1l1l1l1.
%left CM
%right ASOP ASSIGN
%right QUEST COLON
%left OROR
%left ANDAND
%left OROP
%left AND
%binary EQUOP
%binary RELOP
%left SHIFTOP
%left PLUS MINUS
%left MUL DIVOP
%right UNOP
%right INCOP SIZEOF
%left LB LP STROP
.TE
.TS
l1l1l1l1.
program: ext_def_list
ext_def_list: ext_def_list external_def
/\** empty \**/
external_def: optattrib SM
optattrib init_dcl_list SM
optattrib fdeclarator function_body
function_body: dcl_list compoundstmt
dcl_list: dcl_list declaration
/\** empty \**/
declaration: specifiers declarator_list SM
specifiers SM
optattrib: specifiers
/\** empty \**/
specifiers: CLASS type
type CLASS
CLASS
type
type: TYPE
TYPE TYPE
struct_dcl
struct_dcl: STRUCT NAME LC type_dcl_list RC
STRUCT LC type_dcl_list RC
STRUCT NAME
type_dcl_list: type_declaration
type_dcl_list type_declaration
type_declaration: type declarator_list SM
struct_dcl SM
type SM
declarator_list: declarator
declarator_list CM declarator
declarator: fdeclarator
nfdeclarator
nfdeclarator COLON con_e %prec CM
COLON con_e %prec CM
nfdeclarator: MUL nfdeclarator
nfdeclarator LP RP
nfdeclarator LB RB
nfdeclarator LB con_e RB
NAME
LP nfdeclarator RP
fdeclarator: MUL fdeclarator
fdeclarator LP RP
fdeclarator LB RB
fdeclarator LB con_e RB
LP fdeclarator RP
NAME LP name_list RP
NAME LP RP
name_list: NAME
name_list CM NAME
init_dcl_list: init_declarator %prec CM
init_dcl_list CM init_declarator
init_declarator: nfdeclarator
nfdeclarator ASSIGN initializer
nfdeclarator initializer
fdeclarator
init_list: initializer %prec CM
init_list CM initializer
initializer: e %prec CM
LC init_list RC
LC init_list CM RC
compoundstmt: LC dcl_list stmt_list RC
stmt_list: stmt_list statement
/\** empty \**/
statement: e SM
compoundstmt
IF LP e RP statement
IF LP e RP statement ELSE statement
WHILE LP e RP statement
DO statement WHILE LP e RP SM
FOR LP opt_e SM opt_e SM opt_e RP statement
SWITCH LP e RP statement
BREAK SM
CONTINUE SM
RETURN SM
RETURN e SM
GOTO NAME SM
SM
label statement
label: NAME COLON
CASE con_e COLON
DEFAULT COLON
con_e: e %prec CM
opt_e: e
/\** empty \**/
elist: e %prec CM
elist CM e
e: e MUL e
e CM e
e DIVOP e
e PLUS e
e MINUS e
e SHIFTOP e
e RELOP e
e EQUOP e
e AND e
e OROP e
e ANDAND e
e OROR e
e MUL ASSIGN e
e DIVOP ASSIGN e
e PLUS ASSIGN e
e MINUS ASSIGN e
e SHIFTOP ASSIGN e
e AND ASSIGN e
e OROP ASSIGN e
e QUEST e COLON e
e ASOP e
e ASSIGN e
term
term: term INCOP
MUL term
AND term
MINUS term
UNOP term
INCOP term
SIZEOF term
LP type_name RP term %prec STROP
SIZEOF LP type_name RP %prec SIZEOF
term LB e RB
term LP RP
term LP elist RP
term STROP NAME
NAME
ICON
FCON
STRING
LP e RP
type_name: type abst_decl
abst_decl: /\** empty \**/
LP RP
LP abst_decl RP LP RP
MUL abst_decl
abst_decl LB RB
abst_decl LB con_e RB
LP abst_decl RP
.TE