Date: Sat, 11 Aug 2001 22:19:24 +0300 From: Peter Pentchev <roam@ringlet.net> To: brian o'shea <boshea@netapp.com> Cc: Raymond Wiker <Raymond.Wiker@fast.no>, les@safety.net, Rob <europax@home.com>, "hackers@FreeBSD.ORG" <hackers@FreeBSD.ORG> Subject: Re: the =+ operator Message-ID: <20010811221924.C1848@ringworld.oblivion.bg> In-Reply-To: <20010810154630.A27553@netapp.com>; from boshea@netapp.com on Fri, Aug 10, 2001 at 03:46:30PM -0700 References: <3B73F0BC.548D40B3@home.com> <200108101446.HAA99867@safety.net> <15220.9386.441669.962830@raw.grenland.fast.no> <20010810154630.A27553@netapp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Aug 10, 2001 at 03:46:30PM -0700, brian o'shea wrote:
> On Fri, Aug 10, 2001 at 08:15:06PM +0200, Raymond Wiker wrote:
> >
> > This is actually wrong - the += and -= operators were
> > originally written as =+ and =-. This is obviously ambiguous, given
> > the fact that whitespace is ignored.
>
> Why does this have to be ambiguous?
Your largest-possible-token sounds like a good and quite possibly
correct idea, but your example is mightily wrong :)
> Consider this:
>
> int o = 2;
> int *p = &o;
> int q = 8;
> int r;
>
> r = q/*p /* comment */;
>
> printf("r == %d\n", r);
>
>
> Is this equivalent to the following:
>
> r = q / *p;
>
>
> Or is it equivalent to this:
>
> r = q /* p /* comment */ ;
>
>
> C disambiguates between these two possible interpretations by matching
> the largest possible token.
I don't really think so. C disambiguates between these two possible
interpretations by doing at least two passes over the code.
Comments are weeded out by the C preprocessor, which jumps in
at the first /*, and replaces everything until the first */ with
whitespace. The compiler does not have to deal with the */ ambiguity
at all, since it never sees the /*.
> Thus, it is taken to be equivalent to:
>
> r = q;
No, it's not. /* cannot be used in this way, it *is* taken to mean
a comment by the preprocessor, and it produces weird mistakes.
See for yourself: try to compile the following program:
int
main(void) {
int p, *q;
p = 2;
q = &p;
p = p /* q; /* comment */
}
At least here, this is what happens:
[roam@ringworld:v6 ~/c/misc/foo]$ cc -o foo10 foo10.c
foo10.c: In function `main':
foo10.c:8: syntax error before `}'
[roam@ringworld:v6 ~/c/misc/foo]$
That is, the preprocessor has taken the whole of /* q; /* comment */
to be a comment, and has turned the program into:
int
main(void) {
int p, *q;
p = 2;
q = &p;
p = p
}
..which is obviously wrong - no semicolon after the p = p statement.
> In other words, these two lines are not equivalent:
>
> r = q/*p /* comment */;
>
> r = q/ *p /* comment */;
>
>
> So, the =+ operator could be interprited correctly as long as it is the
> largest possible token. It does leave more of an opportunity for human
> misinterpritation, while my example is less likely to be seen.
Once again, yes, the largest-possible-token is a good idea, and possibly
implemented that way in most lex or flex-based parsers, but you picked
a poor example to illustrate it :)
G'luck,
Peter
--
If I were you, who would be reading this sentence?
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010811221924.C1848>
