88 lines
2.6 KiB
Plaintext
88 lines
2.6 KiB
Plaintext
|
.sp 2
|
||
|
.NH
|
||
|
Improvements to the compiler
|
||
|
.nh
|
||
|
.sp
|
||
|
.LP
|
||
|
In consideration of portability, a restricted option could be implemented.
|
||
|
Under this option, the extensions and warnings should be considered as errors.
|
||
|
|
||
|
|
||
|
.LP
|
||
|
The restrictions imposed by the standard on the control variable of a
|
||
|
for-statment should be implemented (\fBISO 6.8.3.9\fR).
|
||
|
|
||
|
.LP
|
||
|
To check whether a function returns a valid result, the following algorithm
|
||
|
could be used. When a function is entered a hidden temporary variable of
|
||
|
type boolean is created. This variable is initialized with the value false.
|
||
|
The variable is set to true, when an assignment to the function name occurs.
|
||
|
On exit of the function a test is performed on the variable. If the value
|
||
|
of the variable is false, a run-time error occurs.
|
||
|
.br
|
||
|
Note: The check has to be done run-time.
|
||
|
|
||
|
|
||
|
.LP
|
||
|
The \fIundefined value\fR should be implemented. A problem arises with
|
||
|
local variables, for which space on the stack is allocated. A possible
|
||
|
solution would be to generate code for the initialization of the local
|
||
|
variables with the undefined value at the beginning of a procedure or
|
||
|
function.
|
||
|
.br
|
||
|
The implementation for the global variables is easy, because \fBbss\fR
|
||
|
blocks are used.
|
||
|
|
||
|
|
||
|
.LP
|
||
|
Closely related to the last point is the generation of warnings when
|
||
|
variables are never used or assigned. This is not yet implemented.
|
||
|
|
||
|
|
||
|
.LP
|
||
|
The error messages could specify more details about the errors occurred,
|
||
|
if some additional testing is done.
|
||
|
|
||
|
.bp
|
||
|
.LP
|
||
|
Every time the compiler detects sets with different base-types, a warning
|
||
|
is given. Sometimes this is superfluous.
|
||
|
|
||
|
.nf
|
||
|
\fBprogram\fR sets(output);
|
||
|
\fBtype\fR
|
||
|
week = (sunday, monday, tuesday, wednesday, thursday, friday, saturday);
|
||
|
workweek = monday..friday;
|
||
|
\fBvar\fR
|
||
|
s : \fBset of\fR workweek;
|
||
|
day : week;
|
||
|
\fBbegin\fR
|
||
|
day := monday;
|
||
|
s := [day]; (* warning *)
|
||
|
day := saturday;
|
||
|
s := [day]; (* warning *)
|
||
|
\fBend\fR.
|
||
|
.fi
|
||
|
The new compiler gives two warnings, the first one is redundant.
|
||
|
|
||
|
|
||
|
.LP
|
||
|
A nasty point in the compiler is the way the procedures \fIread, readln,
|
||
|
write\fR and \fIwriteln\fR are handled (see also section 2.2). They have
|
||
|
been added to the grammar. This implies that they can not be redefined as
|
||
|
opposed to the other required procedures and functions. They should be
|
||
|
removed from the grammar altogether. This could imply that more semantic
|
||
|
checks have to be performed.
|
||
|
|
||
|
|
||
|
.LP
|
||
|
No effort is made to detect possible run-time errors during compilation.
|
||
|
.br
|
||
|
E.g. a : \fBarray\fR[1..10] \fBof\fI something\fR, and the array selection
|
||
|
a[11] would occur.
|
||
|
|
||
|
|
||
|
.LP
|
||
|
Some assistance to implement the improvements mentioned above, can be
|
||
|
obtained from [PCV].
|