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

Reply via email to