Robert Fraser wrote:
Stewart Gordon wrote:
Have you written a compiler for a superset of C in which arbitrary
forward references are allowed? How did you do with overcoming the
difficulty that is C's context-sensitive grammar?
C (minus preprocessor, of course) is only context-sensitive with regards
to casts AFAIK. Since casts are always expressions, you can rewrite
parenthesized expressions to casts (or vice versa) in a second pass but
still allow forward references.
<snip>
Not quite. For example, is
qwert * yuiop;
a declaration of yuiop as a pointer to a qwert, or an instruction to
multiply qwert by yuiop but do nothing with the result?
OK, so since it's ambiguous only within a function, it won't have to
worry about running yet another pass to resolve the forward references
to yuiop. But FAIK there may be other cases that are more complicated
to deal with.
(That said, a D compiler probably needs more passes than this to resolve
all possible cases of conditional compilation that may rely on forward
referenced symbols. But then again, D is designed from the ground up
for multi-pass compilation.)
Stewart.