# Re: Peculiarity in Ada grammar

## nebbe@lglsun.epfl.ch (Robb Nebbe)Thu, 20 Jan 1994 10:17:39 GMT

From comp.compilers

Related articles
Peculiarity in Ada grammar clsi!graham@uunet.UU.NET (1994-01-19)
Re: Peculiarity in Ada grammar nebbe@lglsun.epfl.ch (1994-01-20)
Re: Peculiarity in Ada grammar burley@mole.gnu.ai.mit.edu (1994-01-20)
| List of all articles for this month |

 Newsgroups: comp.compilers From: nebbe@lglsun.epfl.ch (Robb Nebbe) Keywords: Ada, parse, design Organization: Ecole Polytechnique Federale de Lausanne References: 94-01-071 Date: Thu, 20 Jan 1994 10:17:39 GMT

clsi!graham@uunet.UU.NET (Paul Graham) writes:
: Ada has only one precedence for minus, at the cost of giving unary minus
: lower precedence than multiplication operators. This has the unintuitive
: effect of making
: -5 mod 3 = -(5 mod 3)
: while
: -5 mod 3 /= (-5) mod 3
:
: I wonder if Ada's expression grammar was designed with operator precedence
: parsing in mind? Otherwise, how can the unintuitive precedence of unary
: minus be explained?

Here is an example that is "intuitive" and depends on the the precedence

7 - 5 mod 3 <=> 7 - (5 mod 3) = 5

now if I eliminate the 7 I have

- 5 mod 3 <=> -( 5 mod 3) = -2

which just has the effect of subtracting 7. If unary minus had a higher
precedence than multiplying operators then the second case would have a
result of 2 which to me seems unintuitive.

A simple solution is to use rem instead of mod (rem is the equivalent of %
in C) which gives:

-5 rem 3 <=> -(5 rem 3) = (-5) rem 3 = -2

operators it would just switch when you get an "unintuitive" result making
the decision a bit arbitrary. Especially since it doesn't make any
difference for the other multiplying operators.

I think the major reason for having the same precedence for both binary
and unary adding operators is to increase readability : A + -B isn't
allowed because it was deemed more readable to write A - B or A + (-B).
The obvious parsing problem prevented by this is allowing a binary adding
operator followed by an unary adding operator which would make the case of
A--B ambiguous; is it A - (-B) or A followed by the comment "--B"?

Disclamer: I'm not sure which came first , using "--" to introduce
comments or not allowing a binary adding operator followed by a unary