[mod.std.c] mod.std.c Digest V8#2

osd@hou2d.UUCP (Orlando Sotomayor-Diaz) (07/01/85)

From: Orlando Sotomayor-Diaz (The Moderator) <cbosgd!std-c>


mod.std.c Digest            Mon,  1 Jul 85       Volume 8 : Issue   2 

Today's Topics:
             Section C.3.15 Conditional operator (2 msgs)
----------------------------------------------------------------------

Date: Thu, 20 Jun 85 20:58 EDT
From: ihnp4!trwrb!trwspp!spp2!jhull
Subject: Section C.3.15 Conditional operator
To: Mark Purtill <ucbvax!Purtill@MIT-MULTICS.ARPA>

>Syntax
> conditional-expression:
>     logical-OR-expression
>     logical-OR-expression ? logical-OR-expression : conditional-expression
This allows a?b:c?d:e but not a?b?c:d:e, which seems strange, especially
as I prefer the second.  (The first could be read as (a?b:c)?d:e, but
the second is unambiguous).  I suggest changing the last line to
      logical-OR-expression ? conditional-expression : conditional-expression

Mark,
	I think you have missed the point.  There is (I think) no 
sequence of productions which could result in the interpretation you
show in parentheses above.  While a person reading the unparenthesized
version might not know how the compiler would interpret it, the
compiler would always produce the same result.  This is analogous to
establishing precedence among arithmetic operators.
	Furthermore, if your productions were adopted, ambiguity
*would* result.  Let me abbreviate logical-OR-expression by l-e and
conditional expression by c-e.  Let me call the first production above
1 & your recommended production 2.  Let me use a number in parentheses
to designate which one of several identical non-terminal symbols on a
line is to be replaced by that production.  Then,

2	c-e ->
2(1)		l-e ? c-e : c-e
2(2)		l-e ? c-e : l-e ? c-e : c-e
1(1,2,3)	l-e ? l-e : l-e ? l-e : l-e
		 a  ?  b  :  c  ?  d  :  e
is clearly legal even though you don't like it.  But now we can see
the ambiguity.  How do you parse that?  Do you reduce a?b:c before you
reduce c?d:e or vice-versa?  Ambiguity in a grammar refers to the
parser not being able to decide which production to apply to which
token.  It does not refer to whether or not the programmer understands
what the compiler is doing.

------------------------------

Date: Sat, 29 Jun 85 17:35 EDT
From: Mark Purtill <ucbvax!Purtill@MIT-MULTICS.ARPA>
Subject: Section C.3.15 Conditional operator
To: Jeff Hull <trwrb!trwspp!spp2!jhull@BERKELEY>

First off, I know that the compiler will not misinterpert a?b:c?d:e as
(a?b:c)?d:e.  But the PROGRAMMER might.  To argue that this is no
problem since the compiler will know what's going on is to miss the
whole point.  (I seem to recall that there was once a language in which 
"ELSE" meant "then in any case, do the following."  This was not usually
what the writter of the program meant; the fact that the compiler "knew"
what it was doing didn't prevent all the errors that naturally cropped
when the programmer thought "ELSE" meant "else", and eventually it had
to be changed. (Incidentally, does anyone else remember this or is it a
figment of my imagination.))
 
Second, a?b:c?d:e *is* unambiguous, since my production is

cond-ex := *log-ex* ? cond-ex : cond-ex.  

The compiler may not reduce a?b:c first, since it's not a logical
expression, which is required for the thing before the '?'.  So you must
do c?d:e => cond-ex, then a?b:cond-ex => cond-ex.  If it does a?b:c =>
cond-ex, its left with cond-ex?c:d, and loses.  Now, I see that it might
be hard for the compiler to deduce this fact, but that didn't seem to be
your point.

Now, personally, I'd be happy with

cond-ex := log-ex ? cond-ex : log-ex.

This forbids a?b:c?d:e, which is fine by me, and allows a?b?c:d:e.  One
could even make a case for

cond-ex := cond-ex ? log-ex : log-ex,

which has the virtue that the compiler is allowed to reduce as soon as
it can.  (a?b:c => cond-ex, now read ?d:e and reduce again.) But in the
interests of clarity, perhaps the production should be

cond-ex := log-ex ? log-ex : log-ex.

This forces you to replace a?b:c:d:e with a?(b?c:d):e and a?b:c?d:e with
a?b:(c?d:e).  In other words, it forces parens to be used, which is
what you ought to be doing in the first place.  

Basically, my complaint is that the existing production encourages code
that could be misread (and there doesn't seem to be any good reason for
this) while not allowing the still unpleasant but somewhat nicer form
that I prefer.

       Mark
^.-.^  Purtill at MIT-MULTICS.ARPA    **Insert favorite disclaimer here**
(("))  2-032 MIT Cambridge MA 02139

------------------------------

End of mod.std.c Digest - Mon,  1 Jul 85 09:57:50 EDT
******************************
USENET -> posting only through cbosgd!std-c.
ARPA -> ... through cbosgd!std-c@BERKELEY.ARPA (NOT to INFO-C)
In all cases, you may also reply to the author(s) above.