628 lines
19 KiB
Plaintext
628 lines
19 KiB
Plaintext
|
.EQ
|
||
|
delim $$
|
||
|
.EN
|
||
|
.RP
|
||
|
.TL
|
||
|
ACK/CEM Compiler
|
||
|
.br
|
||
|
Reference Manual
|
||
|
.AU
|
||
|
Erik H. Baalbergen
|
||
|
.AI
|
||
|
Department of Mathematics and Computer Science
|
||
|
Vrije Universiteit
|
||
|
Amsterdam
|
||
|
The Netherlands
|
||
|
.AB no
|
||
|
.AE
|
||
|
.NH
|
||
|
C Language
|
||
|
.PP
|
||
|
This section discusses the extensions to and deviations from the C language,
|
||
|
as described in [1].
|
||
|
The issues are numbered according to the reference manual.
|
||
|
.SH
|
||
|
2.2 Identifiers
|
||
|
.PP
|
||
|
Upper and lower case letters are different.
|
||
|
The number of significant letters
|
||
|
is 32 by default, but may be set to another value using the \fB\-M\fP option.
|
||
|
The identifier length should be set according to the rest of the compilation
|
||
|
programs.
|
||
|
.SH
|
||
|
2.3 Keywords
|
||
|
.SH
|
||
|
\f5asm\fP
|
||
|
.PP
|
||
|
The keyword \f5asm\fP
|
||
|
is recognized.
|
||
|
However, the statement
|
||
|
.DS
|
||
|
.ft 5
|
||
|
asm(string);
|
||
|
.ft R
|
||
|
.DE
|
||
|
is skipped, while a warning is given.
|
||
|
.SH
|
||
|
\f5enum\fP
|
||
|
.PP
|
||
|
The \f5enum\fP keyword is recognized and interpreted.
|
||
|
.SH
|
||
|
\f5entry\fP, \f5fortran\fP
|
||
|
.PP
|
||
|
The words \f5entry\fP and \f5fortran\fP
|
||
|
are reserved under the restricted option.
|
||
|
The words are not interpreted by the compiler.
|
||
|
.SH
|
||
|
2.4.1 Integer Constants
|
||
|
.PP
|
||
|
An octal or hex constant which is less than or equal to the largest unsigned
|
||
|
(target) machine integer is taken to be \f5unsigned\fP.
|
||
|
An octal or hex constant which exceeds the largest unsigned (target) machine
|
||
|
integer is taken to be \f5long\fP.
|
||
|
.SH
|
||
|
2.4.3 Character Constants
|
||
|
.PP
|
||
|
A character constant is a sequence of 1 up to \f5sizeof(int)\fP characters
|
||
|
enclosed in single quotes.
|
||
|
The value of a character constant '$c sub 1 c sub 2 ... c sub n$'
|
||
|
is $d sub n + M \(mu d sub {n - 1} + ... + M sup {n - 1} \(mu d sub 2 + M sup n \(mu d sub 1$,
|
||
|
where M is 1 + maximum unsigned number representable in an \f5unsigned char\fP,
|
||
|
and $d sub i$ is the signed value (ASCII)
|
||
|
of character $c sub i$.
|
||
|
.SH
|
||
|
2.4.4 Floating Constants
|
||
|
.PP
|
||
|
The compiler does not support compile-time floating point arithmetic.
|
||
|
.SH
|
||
|
2.6 Hardware characteristics
|
||
|
.PP
|
||
|
The compiler is capable of producing EM code for machines with the following
|
||
|
properties
|
||
|
.IP \(bu
|
||
|
a \f5char\fP is 8 bits
|
||
|
.IP \(bu
|
||
|
the size of \f5int\fP is equal to the word size
|
||
|
.IP \(bu
|
||
|
the size of \f5short\fP may not exceed the size of \f5int\fP
|
||
|
.IP \(bu
|
||
|
the size of \f5int\fP may not exceed the size of \f5long\fP
|
||
|
.IP \(bu
|
||
|
the size of pointers is equal to the size of either \f5short\fP, \f5int\fP
|
||
|
or \f5long\fP
|
||
|
.LP
|
||
|
.SH
|
||
|
4 What's in a name?
|
||
|
.SH
|
||
|
\f5char\fP
|
||
|
.PP
|
||
|
Objects of type \f5char\fP are taken to be signed.
|
||
|
The combination \f5unsigned char\fP is legal.
|
||
|
.SH
|
||
|
\f5unsigned\fP
|
||
|
.PP
|
||
|
The type combinations \f5unsigned char\fP, \f5unsigned short\fP and
|
||
|
\f5unsigned long\fP are supported.
|
||
|
.SH
|
||
|
\f5enum\fP
|
||
|
.PP
|
||
|
The data type \f5enum\fP is implemented as described
|
||
|
in \fIRecent Changes to C\fP (see appendix A).
|
||
|
.I Cem
|
||
|
treats enumeration variables as if they were \f5int\fP.
|
||
|
.SH
|
||
|
\f5void\fP
|
||
|
.PP
|
||
|
Type \f5void\fP is implemented.
|
||
|
The type specifies an empty set of values, which takes no storage space.
|
||
|
.SH
|
||
|
\fRFundamental types\fP
|
||
|
.PP
|
||
|
The names of the fundamental types can be redefined by the user, using
|
||
|
\f5typedef\fP.
|
||
|
.SH
|
||
|
7 Expressions
|
||
|
.PP
|
||
|
The order of evaluation of expressions depends on the complexity of the
|
||
|
subexpressions.
|
||
|
In case of commutative operations, the most complex subexpression is
|
||
|
evaluated first.
|
||
|
Parameter lists are evaluated from right to left.
|
||
|
.SH
|
||
|
7.2 Unary operators
|
||
|
.PP
|
||
|
The type of a \f5sizeof\fP expression is \f5unsigned int\fP.
|
||
|
.SH
|
||
|
7.13 Conditional operator
|
||
|
.PP
|
||
|
Both the second and the third expression in a conditional expression may
|
||
|
include assignment operators.
|
||
|
They may be structs or unions.
|
||
|
.SH
|
||
|
7.14 Assignment operators
|
||
|
.PP
|
||
|
Structures may be assigned, passed as arguments to functions, and returned
|
||
|
by functions.
|
||
|
The types of operands taking part must be the same.
|
||
|
.SH
|
||
|
8.2 Type specifiers
|
||
|
.PP
|
||
|
The combinations \f5unsigned char\fP, \f5unsigned short\fP
|
||
|
and \f5unsigned long\fP are implemented.
|
||
|
.SH
|
||
|
8.5 Structure and union declarations
|
||
|
.PP
|
||
|
Fields of any integral type, either signed or unsigned,
|
||
|
are supported, as long as the type fits in a word on the target machine.
|
||
|
.PP
|
||
|
Fields are left adjusted by default; the first field is put into the left
|
||
|
part of a word, the next one on the right side of the first one, etc.
|
||
|
The \f5-Vr\fP option in the call of the compiler
|
||
|
causes fields to be right adjusted within a machine word.
|
||
|
.PP
|
||
|
The tags of structs and unions occupy a different name space from that of
|
||
|
variables and that of member names.
|
||
|
.SH
|
||
|
9.7 Switch statement
|
||
|
.PP
|
||
|
The type of \fIexpression\fP in
|
||
|
.DS
|
||
|
.ft 5
|
||
|
\f5switch (\fP\fIexpression\fP\f5)\fP \fIstatement\fP
|
||
|
.ft
|
||
|
.DE
|
||
|
must be integral.
|
||
|
A warning is given under the restricted option if the type is \f5long\fP.
|
||
|
.SH
|
||
|
10 External definitions
|
||
|
.PP
|
||
|
See [4] for a discussion on this complicated issue.
|
||
|
.SH
|
||
|
10.1 External function definitions
|
||
|
.PP
|
||
|
Structures may be passed as arguments to functions, and returned
|
||
|
by functions.
|
||
|
.SH
|
||
|
11.1 Lexical scope
|
||
|
.PP
|
||
|
Typedef names may be redeclared like any other variable name; the ice mentioned
|
||
|
in \(sc11.1 is walked correctly.
|
||
|
.SH
|
||
|
12 Compiler control lines
|
||
|
.PP
|
||
|
Lines which do not occur within comment, and with \f5#\fP as first
|
||
|
character, are interpreted as compiler control line.
|
||
|
There may be an arbitrary number of spaces, tabs and comments (collectively
|
||
|
referred as \fIwhite space\fP) following the \f5#\fP.
|
||
|
Comments may contain newline characters.
|
||
|
Control lines with only white space between the \f5#\fP and the line separator
|
||
|
are skipped.
|
||
|
.PP
|
||
|
The #\f5include\fP, #\f5ifdef\fP, #\f5ifndef\fP, #\f5undef\fP, #\f5else\fP and
|
||
|
#\f5endif\fP control lines and line directives consist of a fixed number of
|
||
|
arguments.
|
||
|
The list of arguments may be followed an arbitrary sequence of characters,
|
||
|
in which comment is interpreted as such.
|
||
|
(I.e., the text between \f5/*\fP and \f5*/\fP is skipped, regardless of
|
||
|
newlines; note that commented-out lines beginning with \f5#\fP are not
|
||
|
considered to be control lines.)
|
||
|
.SH
|
||
|
12.1 Token replacement
|
||
|
.PP
|
||
|
The replacement text of macros is taken to be a string of characters, in which
|
||
|
an identifier may stand for a formal parameter, and in which comment is
|
||
|
interpreted as such.
|
||
|
Comments and newline characters, preceeded by a backslash, in the replacement
|
||
|
text are replaced by a space character.
|
||
|
.PP
|
||
|
The actual parameters of a macro are considered tokens and are
|
||
|
balanced with regard to \f5()\fP, \f5{}\fP and \f5[]\fP.
|
||
|
This prevents the use of macros like
|
||
|
.DS
|
||
|
.ft 5
|
||
|
CTL([)
|
||
|
.ft
|
||
|
.DE
|
||
|
.PP
|
||
|
Formal parameters of a macro must have unique names within the formal-parameter
|
||
|
list of that macro.
|
||
|
.PP
|
||
|
A message is given at the definition of a macro if the macro has
|
||
|
already been #\f5defined\fP, while the number of formal parameters differ or
|
||
|
the replacement texts are not equal (apart from leading and trailing
|
||
|
white space).
|
||
|
.PP
|
||
|
Recursive use of macros is detected by the compiler.
|
||
|
.PP
|
||
|
Standard #\f5defined\fP macros are
|
||
|
.DS
|
||
|
\f5__FILE__\fP name of current input file as string constant
|
||
|
\f5__DATE__\fP curent date as string constant; e.g. \f5"Tue Wed 2 14:45:23 1986"\fP
|
||
|
\f5__LINE__\fP current line number as an integer
|
||
|
.DE
|
||
|
.PP
|
||
|
No message is given if \fIidentifier\fP is not known in
|
||
|
.DS
|
||
|
.ft 5
|
||
|
#undef \fIidentifier\fP
|
||
|
.ft
|
||
|
.DE
|
||
|
.SH
|
||
|
12.2 File inclusion
|
||
|
.PP
|
||
|
A newline character is appended to each file which is included.
|
||
|
.SH
|
||
|
12.3 Conditional compilation
|
||
|
.PP
|
||
|
The #\f5if\fP, #\f5ifdef\fP and #\f5ifndef\fP control lines may be followed
|
||
|
by an arbitrary number of
|
||
|
.DS
|
||
|
.ft 5
|
||
|
#elif \fIconstant-expression\fP
|
||
|
.ft
|
||
|
.DE
|
||
|
control lines, before the corresponding #\f5else\fP or #\f5endif\fP
|
||
|
is encountered.
|
||
|
The construct
|
||
|
.DS
|
||
|
.ft 5
|
||
|
#elif \fIconstant-expression\fP
|
||
|
some text
|
||
|
#endif /* corresponding to #elif */
|
||
|
.ft
|
||
|
.DE
|
||
|
is equivalent to
|
||
|
.DS
|
||
|
.ft 5
|
||
|
#else
|
||
|
#if \fIconstant-expression\fP
|
||
|
some text
|
||
|
#endif /* corresponding to #if */
|
||
|
#endif /* corresponding to #else */
|
||
|
.ft
|
||
|
.DE
|
||
|
.PP
|
||
|
The \fIconstant-expression\fP in #\f5if\fP and #\f5elif\fP control lines
|
||
|
may contain the construction
|
||
|
.DS
|
||
|
.ft 5
|
||
|
defined(\fIidentifier\fP)
|
||
|
.ft
|
||
|
.DE
|
||
|
which is replaced by \f51\fP, if \fIidentifier\fP has been #\f5defined\fP,
|
||
|
and by \f50\fP, if not.
|
||
|
.PP
|
||
|
Comments in skipped lines are interpreted as such.
|
||
|
.SH
|
||
|
12.4 Line control
|
||
|
.PP
|
||
|
Line directives may occur in the following forms:
|
||
|
.DS
|
||
|
.ft 5
|
||
|
#line \fIconstant\fP
|
||
|
#line \fIconstant\fP "\fIfilename\fP"
|
||
|
#\fIconstant\fP
|
||
|
#\fIconstant\fP "\fIfilename\fP"
|
||
|
.ft
|
||
|
.DE
|
||
|
Note that \fIfilename\fP is enclosed in double quotes.
|
||
|
.SH
|
||
|
14.2 Functions
|
||
|
.PP
|
||
|
If a pointer to a function is called, the function the pointer points to
|
||
|
is called instead.
|
||
|
.SH
|
||
|
15 Constant expressions
|
||
|
.PP
|
||
|
The compiler distinguishes the following types of integral constant expressions
|
||
|
.IP \(bu
|
||
|
field-width specifier
|
||
|
.IP \(bu
|
||
|
case-entry specifier
|
||
|
.IP \(bu
|
||
|
array-size specifier
|
||
|
.IP \(bu
|
||
|
global variable initialization value
|
||
|
.IP \(bu
|
||
|
enum-value specifier
|
||
|
.IP \(bu
|
||
|
truth value in \f5#if\fP control line
|
||
|
.LP
|
||
|
.PP
|
||
|
Constant integral expressions are compile-time evaluated while an effort
|
||
|
is made to report overflow.
|
||
|
Constant floating expressions are not compile-time evaluated.
|
||
|
.NH
|
||
|
Compiler flags
|
||
|
.IP \fB\-C\fR
|
||
|
Run the preprocessor stand-alone while maintaining the comments.
|
||
|
Line directives are produced whenever needed.
|
||
|
.IP \fB\-D\fP\fIname\fP=\fIstring-of-characters\fP
|
||
|
.br
|
||
|
Define \fIname\fR as macro with \fIstring-of-characters\fR as
|
||
|
replacement text.
|
||
|
.IP \fB\-D\fP\fIname\fP
|
||
|
.br
|
||
|
Equal to \fB\-D\fP\fIname\fP\fB=1\fP.
|
||
|
.IP \fB\-E\fP
|
||
|
Run the preprocessor stand alone, i.e.,
|
||
|
list the sequence of input tokens and delete any comments.
|
||
|
Line directives are produced whenever needed.
|
||
|
.IP \fB\-I\fIpath\fR
|
||
|
.br
|
||
|
Prepend \fIpath\fR to the list of include directories.
|
||
|
To put the directories "include", "sys/h" and "util/h" into the
|
||
|
include directory list in that order, the user has to specify
|
||
|
.DS
|
||
|
.ft 5
|
||
|
-Iinclude -Isys/h -Iutil/h
|
||
|
.ft R
|
||
|
.DE
|
||
|
An empty \fIpath\fP causes the standard include
|
||
|
directory (usually \f5/usr/include\fP) to be forgotten.
|
||
|
.IP \fB\-M\fP\fIn\fP
|
||
|
.br
|
||
|
Set maximum significant identifier length to \fIn\fP.
|
||
|
.IP \fB\-n\fP
|
||
|
Suppress EM register messages.
|
||
|
The user-declared variables are not stored into registers on the target
|
||
|
machine.
|
||
|
.IP \fB\-p\fP
|
||
|
Generate the EM \fBfil\fP and \fBlin\fP instructions in order to enable
|
||
|
an interpreter to keep track of the current location in the source code.
|
||
|
.IP \fB\-P\fP
|
||
|
Equivalent with \fB\-E\fP, but without line directives.
|
||
|
.IP \fB\-R\fP
|
||
|
Interpret the input as restricted C (according to the language as
|
||
|
described in [1]).
|
||
|
.IP \fB\-T\fP\fIpath\fP
|
||
|
.br
|
||
|
Create temporary files, if necessary, in directory \fIpath\fP.
|
||
|
.IP \fB\-U\fP\fIname\fP
|
||
|
.br
|
||
|
Get rid of the compiler-predefined macro \fIname\fP, i.e.,
|
||
|
consider
|
||
|
.DS
|
||
|
.ft 5
|
||
|
#undef \fIname\fP
|
||
|
.ft R
|
||
|
.DE
|
||
|
to appear in the beginning of the file.
|
||
|
.IP \fB\-V\fIcm\fR.\fIn\fR,\ \fB\-V\fIcm\fR.\fIncm\fR.\fIn\fR\ ...
|
||
|
.br
|
||
|
Set the size and alignment requirements.
|
||
|
The letter \fIc\fR indicates the simple type, which is one of
|
||
|
\fBs\fR(short), \fBi\fR(int), \fBl\fR(long), \fBf\fR(float), \fBd\fR(double)
|
||
|
or \fBp\fR(pointer).
|
||
|
If \fIc\fR is \fBS\fP or \fBU\fP, then \fIn\fP is taken to be the initial
|
||
|
alignment of structs or unions, respectively.
|
||
|
The effective alignment of a struct or union is the least common multiple
|
||
|
of the initial struct/union alignment and the alignments of its members.
|
||
|
The \fIm\fR parameter can be used to specify the length of the type (in bytes)
|
||
|
and the \fIn\fR parameter for the alignment of that type.
|
||
|
Absence of \fIm\fR or \fIn\fR causes the default value to be retained.
|
||
|
To specify that the bitfields should be right adjusted instead of the
|
||
|
default left adjustment, specify \fBr\fR as \fIc\fR parameter.
|
||
|
.IP \fB\-w\fR
|
||
|
Suppress warning messages
|
||
|
.IP \fB\-\-\fIcharacter\fR
|
||
|
.br
|
||
|
Set debug-flag \fIcharacter\fP.
|
||
|
This enables some special features offered by a debug and develop version of
|
||
|
the compiler.
|
||
|
Some particular flags may be recognized, others may have surprising effects.
|
||
|
.RS
|
||
|
.IP \fBd\fP
|
||
|
Generate a dependency graph, reflecting the calling structure of functions.
|
||
|
Lines of the form
|
||
|
.DS
|
||
|
.ft 5
|
||
|
DFA: \fIcalling-function\fP: \fIcalled-function\fP
|
||
|
.ft
|
||
|
.DE
|
||
|
are generated whenever a function call is encountered.
|
||
|
.IP \fBf\fP
|
||
|
Dump whole identifier table, including macros and reserved words.
|
||
|
.IP \fBh\fP
|
||
|
Supply hash-table statistics.
|
||
|
.IP \fBi\fP
|
||
|
Print names of included files.
|
||
|
.IP \fBm\fP
|
||
|
Supply statistics concerning the memory allocation.
|
||
|
.IP \fBt\fP
|
||
|
Dump table of identifiers.
|
||
|
.IP \fBu\fP
|
||
|
Generate extra statistics concerning the predefined types and identifiers.
|
||
|
Works in combination with \fBf\fP or \fBt\fP.
|
||
|
.IP \fBx\fP
|
||
|
Print expression trees in human-readable format.
|
||
|
.RE
|
||
|
.LP
|
||
|
.SH
|
||
|
References
|
||
|
.IP [1]
|
||
|
Brian W. Kernighan, Dennis M. Ritchie,
|
||
|
.I
|
||
|
The C Programming Language
|
||
|
.R
|
||
|
.IP [2]
|
||
|
L. Rosler,
|
||
|
.I
|
||
|
Draft Proposed Standard - Programming Language C,
|
||
|
.R
|
||
|
ANSI X3J11 Language Subcommittee
|
||
|
.IP [3]
|
||
|
Erik H. Baalbergen, Dick Grune, Maarten Waage,
|
||
|
.I
|
||
|
The CEM Compiler,
|
||
|
.R
|
||
|
Informatica Manual IM-4, Dept. of Mathematics and Computer Science, Vrije
|
||
|
Universiteit, Amsterdam, The Netherlands
|
||
|
.IP [4]
|
||
|
Erik H. Baalbergen,
|
||
|
.I
|
||
|
Modeling global declarations in C,
|
||
|
.R
|
||
|
internal paper
|
||
|
.LP
|
||
|
.bp
|
||
|
.SH
|
||
|
Appendix A - Enumeration Type
|
||
|
.PP
|
||
|
The syntax is
|
||
|
.sp
|
||
|
.RS
|
||
|
.I enum-specifier :
|
||
|
.RS
|
||
|
\&\f5enum\fP { \fIenum-list\fP }
|
||
|
.br
|
||
|
\&\f5enum\fP \fIidentifier\fP { \fIenum-list\fP }
|
||
|
.br
|
||
|
\&\f5enum\fP \fIidentifier\fP
|
||
|
.RE
|
||
|
.sp
|
||
|
\&\fIenum-list\fP :
|
||
|
.RS
|
||
|
\&\fIenumerator\fP
|
||
|
.br
|
||
|
\&\fIenum-list\fP , \fIenumerator\fP
|
||
|
.RE
|
||
|
.sp
|
||
|
\&\fIenumerator\fP :
|
||
|
.RS
|
||
|
\&\fIidentifier\fP
|
||
|
.br
|
||
|
\&\fIidentifier\fP = \fIconstant-expression\fP
|
||
|
.RE
|
||
|
.sp
|
||
|
.RE
|
||
|
The identifier has the same role as the structure tag in a struct specification.
|
||
|
It names a particular enumeration type.
|
||
|
.PP
|
||
|
The identifiers in the enum-list are declared as constants, and may appear
|
||
|
whenever constants are required.
|
||
|
If no enumerators with
|
||
|
.B =
|
||
|
appear, then the values of the constants begin at 0 and increase by 1 as the
|
||
|
declaration is read from left to right.
|
||
|
An enumerator with
|
||
|
.B =
|
||
|
gives the associated identifier the value indicated; subsequent identifiers
|
||
|
continue the progression from the assigned value.
|
||
|
.PP
|
||
|
Enumeration tags and constants must all be distinct, and, unlike structure
|
||
|
tags and members, are drawn from the same set as ordinary identifiers.
|
||
|
.PP
|
||
|
Objects of a given enumeration type are regarded as having a type distinct
|
||
|
from objects of all other types.
|
||
|
.bp
|
||
|
.SH
|
||
|
Appendix B: C grammar in LL(1) form
|
||
|
.PP
|
||
|
The \fBbold-faced\fP and \fIitalicized\fP tokens represent terminal symbols.
|
||
|
.vs 16
|
||
|
.nf
|
||
|
\fBexternal definitions\fP
|
||
|
program: external-definition*
|
||
|
external-definition: ext-decl-specifiers [declarator [function | non-function] | '\fB;\fP'] | asm-statement
|
||
|
ext-decl-specifiers: decl-specifiers?
|
||
|
non-function: initializer? ['\fB,\fP' init-declarator]* '\fB;\fP'
|
||
|
function: declaration* compound-statement
|
||
|
.sp 1
|
||
|
\fBdeclarations\fP
|
||
|
declaration: decl-specifiers init-declarator-list? '\fB;\fP'
|
||
|
decl-specifiers: other-specifier+ [single-type-specifier other-specifier*]? | single-type-specifier other-specifier*
|
||
|
other-specifier: \fBauto\fP | \fBstatic\fP | \fBextern\fP | \fBtypedef\fP | \fBregister\fP | \fBshort\fP | \fBlong\fP | \fBunsigned\fP
|
||
|
type-specifier: decl-specifiers
|
||
|
single-type-specifier: \fItype-identifier\fP | struct-or-union-specifier | enum-specifier
|
||
|
init-declarator-list: init-declarator ['\fB,\fP' init-declarator]*
|
||
|
init-declarator: declarator initializer?
|
||
|
declarator: primary-declarator ['\fB(\fP' formal-list ? '\fB)\fP' | arrayer]* | '\fB*\fP' declarator
|
||
|
primary-declarator: identifier | '\fB(\fP' declarator '\fB)\fP'
|
||
|
arrayer: '\fB[\fP' constant-expression? '\fB]\fP'
|
||
|
formal-list: formal ['\fB,\fP' formal]*
|
||
|
formal: identifier
|
||
|
enum-specifier: \fBenum\fP [enumerator-pack | identifier enumerator-pack?]
|
||
|
enumerator-pack: '\fB{\fP' enumerator ['\fB,\fP' enumerator]* '\fB,\fP'? '\fB}\fP'
|
||
|
enumerator: identifier ['\fB=\fP' constant-expression]?
|
||
|
struct-or-union-specifier: [ \fBstruct\fP | \fBunion\fP] [ struct-declaration-pack | identifier struct-declaration-pack?]
|
||
|
struct-declaration-pack: '\fB{\fP' struct-declaration+ '\fB}\fP'
|
||
|
struct-declaration: type-specifier struct-declarator-list '\fB;\fP'?
|
||
|
struct-declarator-list: struct-declarator ['\fB,\fP' struct-declarator]*
|
||
|
struct-declarator: declarator bit-expression? | bit-expression
|
||
|
bit-expression: '\fB:\fP' constant-expression
|
||
|
initializer: '\fB=\fP'? initial-value
|
||
|
cast: '\fB(\fP' type-specifier abstract-declarator '\fB)\fP'
|
||
|
abstract-declarator: primary-abstract-declarator ['\fB(\fP' '\fB)\fP' | arrayer]* | '\fB*\fP' abstract-declarator
|
||
|
primary-abstract-declarator: ['\fB(\fP' abstract-declarator '\fB)\fP']?
|
||
|
.sp 1
|
||
|
\fBstatements\fP
|
||
|
statement:
|
||
|
expression-statement
|
||
|
| label '\fB:\fP' statement
|
||
|
| compound-statement
|
||
|
| if-statement
|
||
|
| while-statement
|
||
|
| do-statement
|
||
|
| for-statement
|
||
|
| switch-statement
|
||
|
| case-statement
|
||
|
| default-statement
|
||
|
| break-statement
|
||
|
| continue-statement
|
||
|
| return-statement
|
||
|
| jump
|
||
|
| '\fB;\fP'
|
||
|
| asm-statement
|
||
|
;
|
||
|
expression-statement: expression '\fB;\fP'
|
||
|
label: identifier
|
||
|
if-statement: \fBif\fP '\fB(\fP' expression '\fB)\fP' statement [\fBelse\fP statement]?
|
||
|
while-statement: \fBwhile\fP '\fB(\fP' expression '\fB)\fP' statement
|
||
|
do-statement: \fBdo\fP statement \fBwhile\fP '\fB(\fP' expression '\fB)\fP' '\fB;\fP'
|
||
|
for-statement: \fBfor\fP '\fB(\fP' expression? '\fB;\fP' expression? '\fB;\fP' expression? '\fB)\fP' statement
|
||
|
switch-statement: \fBswitch\fP '\fB(\fP' expression '\fB)\fP' statement
|
||
|
case-statement: \fBcase\fP constant-expression '\fB:\fP' statement
|
||
|
default-statement: \fBdefault\fP '\fB:\fP' statement
|
||
|
break-statement: \fBbreak\fP '\fB;\fP'
|
||
|
continue-statement: \fBcontinue\fP '\fB;\fP'
|
||
|
return-statement: \fBreturn\fP expression? '\fB;\fP'
|
||
|
jump: \fBgoto\fP identifier '\fB;\fP'
|
||
|
compound-statement: '\fB{\fP' declaration* statement* '\fB}\fP'
|
||
|
asm-statement: \fBasm\fP '\fB(\fP' \fIstring\fP '\fB)\fP' '\fB;\fP'
|
||
|
.sp 1
|
||
|
\fBexpressions\fP
|
||
|
initial-value: assignment-expression | initial-value-pack
|
||
|
initial-value-pack: '\fB{\fP' initial-value-list '\fB}\fP'
|
||
|
initial-value-list: initial-value ['\fB,\fP' initial-value]* '\fB,\fP'?
|
||
|
primary: \fIidentifier\fP | constant | \fIstring\fP | '\fB(\fP' expression '\fB)\fP'
|
||
|
secundary: primary [index-pack | parameter-pack | selection]*
|
||
|
index-pack: '\fB[\fP' expression '\fB]\fP'
|
||
|
parameter-pack: '\fB(\fP' parameter-list? '\fB)\fP'
|
||
|
selection: ['\fB.\fP' | '\fB\->\fP'] identifier
|
||
|
parameter-list: assignment-expression ['\fB,\fP' assignment-expression]*
|
||
|
postfixed: secundary postop?
|
||
|
unary: cast unary | postfixed | unop unary | size-of
|
||
|
size-of: \fBsizeof\fP [cast | unary]
|
||
|
binary-expression: unary [binop binary-expression]*
|
||
|
conditional-expression: binary-expression ['\fB?\fP' expression '\fB:\fP' assignment-expression]?
|
||
|
assignment-expression: conditional-expression [asgnop assignment-expression]?
|
||
|
expression: assignment-expression ['\fB,\fP' assignment-expression]*
|
||
|
unop: '\fB*\fP' | '\fB&\fP' | '\fB\-\fP' | '\fB!\fP' | '\fB~ \fP' | '\fB++\fP' | '\fB\-\-\fP'
|
||
|
postop: '\fB++\fP' | '\fB\-\-\fP'
|
||
|
multop: '\fB*\fP' | '\fB/\fP' | '\fB%\fP'
|
||
|
addop: '\fB+\fP' | '\fB\-\fP'
|
||
|
shiftop: '\fB<<\fP' | '\fB>>\fP'
|
||
|
relop: '\fB<\fP' | '\fB>\fP' | '\fB<=\fP' | '\fB>=\fP'
|
||
|
eqop: '\fB==\fP' | '\fB!=\fP'
|
||
|
arithop: multop | addop | shiftop | '\fB&\fP' | '\fB^ \fP' | '\fB|\fP'
|
||
|
binop: arithop | relop | eqop | '\fB&&\fP' | '\fB||\fP'
|
||
|
asgnop: '\fB=\fP' | '\fB+\fP' '\fB=\fP' | '\fB\-\fP' '\fB=\fP' | '\fB*\fP' '\fB=\fP' | '\fB/\fP' '\fB=\fP' | '\fB%\fP' '\fB=\fP'
|
||
|
| '\fB<<\fP' '\fB=\fP' | '\fB>>\fP' '\fB=\fP' | '\fB&\fP' '\fB=\fP' | '\fB^ \fP' '\fB=\fP' | '\fB|\fP' '\fB=\fP'
|
||
|
| '\fB+=\fP' | '\fB\-=\fP' | '\fB*=\fP' | '\fB/=\fP' | '\fB%=\fP'
|
||
|
| '\fB<<=\fP' | '\fB>>=\fP' | '\fB&=\fP' | '\fB^=\fP' | '\fB|=\fP'
|
||
|
constant: \fIinteger\fP | \fIfloating\fP
|
||
|
constant-expression: assignment-expression
|
||
|
identifier: \fIidentifier\fP | \fItype-identifier\fP
|
||
|
.fi
|