Related articles |
---|
C Preprocessor - macro expansion Mark_Kuschnir@gec-epl.co.uk (1993-05-24) |
Re: C Preprocessor - macro expansion davidm@questor.rational.com (1993-05-24) |
Newsgroups: | comp.compilers |
From: | davidm@questor.rational.com (David Moore) |
Keywords: | C |
Organization: | Rational |
References: | 93-05-112 |
Date: | Mon, 24 May 1993 21:59:09 GMT |
Mark_Kuschnir@gec-epl.co.uk writes:
[In ANSI C]
> #define x 2
> #define f(a) f(x * (a))
> #define z z [0]
> f(f(z));
>this should macro expand to :
> f(2 * (f(2 * (z [0]))))
>I would like to know the steps I have to go through when macro expanding
>the above example so as to meet the ANSI provisos :
>(i) the replacement sequence is rescanned until all macros have been
> replaced
>(ii) once an identifier has been used in a replacement sequence
> it won't be used again
The key seems to be in the definition of "expansion sequence". It looks
to me as if the term is meant to mean a tree.
For example, you start with f(f(z)) and after the first substitution
(using the fact that inside-out is mandated, you get:
f (%)
|
f(x*(z))
That is, the % is a place holder for the text that is in the
attached subtree.
which you now expand recursively, but with the f definition marked as
unusable. So you get at step 2 (and lumping together both
expansions to save space):
f(%)
|
f(%*(%))
| |
2 z [0]
Whenever you expand, you inherit the list of used definitions from
the parent and add the expansion you have just used - actually, of
course, you just keep parent links and walk up the tree to determine
what expansions you have already used.
I had no idea C macro expansion was this complicated!
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.