ack/doc/pascal/hints.doc
1991-11-01 09:43:36 +00:00

77 lines
2.2 KiB
Plaintext

.sp 1.5i
.nr H1 7
.NH
Hints to change the standard
.nh
.sp
.LP
We encoutered some difficulties when the compiler was developed. In this
chapter some hints are presented to change the standard, which would make
the implementation of the compiler less difficult. The semantics of Pascal
would not be altered by these adaptions.
.sp 2
.LP
\- Some minor changes in the grammar of Pascal from the user's point of view,
but which make the writing of an LL(1) parser considerably easier, could be:
.in +3m
.nf
field-list : [ ( fixed-part [ variant-part ] | variant-part ) ] .
fixed-part : record-section \fB;\fR { record-section \fB;\fR } .
variant-part : \fBcase\fR variant-selector \fBof\fR variant \fB;\fR { variant \fB;\fR } .
case-statement : \fBcase\fR case-index \fBof\fR case-list-element \fB;\fR { case-list-element \fB;\fR } \fBend\fR .
.fi
.in -3m
.LP
\- To ease the semantic checking on sets, the principle of qualified sets could
be used, every set-constructor must be preceeded by its type-identifier:
.nf
.ti +3m
set-constructor : type-identifier \fB[\fR [ member-designator { \fB,\fR member-designator } ] \fB]\fR .
Example:
t1 = set of 1..5;
t2 = set of integer;
The type of [3, 5] would be ambiguous, but the type of t1[3, 5] not.
.fi
.LP
\- Another problem arises from the fact that a function name can appear in
three distinct 'use' contexts: function call, assignment of function
result and as function parameter.
.br
Example:
.in +5m
.nf
\fBprogram\fR function_name;
\fBfunction\fR p(x : integer; function y : integer) : integer;
\fBbegin\fR .. \fBend\fR;
\fBfunction\fR f : integer;
\fBbegin\fR
f := p(f, f); (*)
\fBend\fR;
\fBbegin\fR .. \fBend\fR.
.fi
.in -5m
A possible solution in case of a call (also a procedure call) would be to
make the (possibly empty) actual-parameter-list mandatory. The assignment
of the function result could be changed in a \fIreturn\fR statement.
Though this would change the semantics of the program slightly.
.br
The above statement (*) would look like this: return p(f(), f);
.LP
\- Another extension to the standard could be the implementation of an
\fIotherwise\fR clause in a case-statement. This would behave exactly like
the \fIdefault\fR clause in a switch-statement in C.
.bp