Added
This commit is contained in:
76
doc/pascal/hints.doc
Normal file
76
doc/pascal/hints.doc
Normal file
@@ -0,0 +1,76 @@
|
||||
.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
|
||||
Reference in New Issue
Block a user