statement list = statement { ";" statement }
statementlist itself is not explained; I assume "statementlist" to be the
same as "statement list"
It is included in the definition of the try...except statement.
ELSE/OTHERWISE
I assume that came historically; the first implementation of a PASCAL
compiler I have seen had no else or otherwise in the case startement. Some
ater dialects introduced ELSE, other dialect(s) used OTHERWISE, FPC then
allowed both.
Ambiguity:
It is so. I was a bit astonished.
i := 4 ;
case i of
1,
2: if odd ( i )
then write ( 'odd' )
else write ( 'even' ) ;
end ;
produces nothing, else is part of the if statement, in case of ambiguity the
nearest possibility is used.
i := 4 ;
case i of
1,
2: if odd ( i )
then write ( 'odd' )
; else write ( 'even' ) ;
end ;
produces the print 'even', else is part of the case statement
As I read the syntax of the case statement in ref.pdf, the semicolon before
the else is not even allowed.
the syntax is (see below)
case-statement = "CASE" expression "OF" case { ";" case } [ else-part ]
[ ";" ] .
if you change that to
case-statement = "CASE" expression "OF" case { ";" case } [ ";" ] [
else-part [ ";" ] ] .
then you have what the compiler does.
I never had the problem because before the else I always inserted a ";"
----- Original Message -----
From: "Adriaan van Os via fpc-pascal" <fpc-pascal@lists.freepascal.org>
To: "FPC-Pascal users discussions" <fpc-pascal@lists.freepascal.org>
Cc: "Adriaan van Os" <adri...@adriaan.biz>
Sent: Thursday, December 14, 2023 4:53 PM
Subject: [fpc-pascal] case statement
I am looking in detail at the syntax diagrams in the Freepascal Language
Reference (version 3.2.0)
Section 13.2.2 discusses the case-statement. Translated to EBNF (WSN) the
syntax is
case-statement = "CASE" expression "OF" case { ";" case } [ else-part ]
[ ";" ] .
case = constant [ ".." constant ] { "," constant [ ".." constant ] } ":"
statement .
else-part = [ "ELSE" | "OTHERWISE" ] statementlist .
If this is correct (and the compiler really allows it) then a semicolon
between <case> and <else-part> is not required. Consequently, there is an
ambiguity between an if-then-else statement (as last statement of the
<case>) and an if-then statement (as last statement of the <case>) and an
<else-part>. This is extremely dangerous and I feel that at least the
Language Reference should warn against it.
Even with an obliged semicolon, I always use "OTHERWISE instead of ELSE,
but that's my personal preference.
By the way, the Language Reference doesn't specify what a <statementlist>
is.
Regards,
Adriaan van Os
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal