> > cpu% cat t.c
> > void foo (void)
> > {
> >     double d = 08.7;
> >     USED(d);
> > }
> > cpu% 8c t.c
> > t.c:3 syntax error, last name: 8.7
> > cpu% 
> > 
> > This came up as I’m making my lexer for C able to scan numbers.  I
> > tried to understand ken’s code, but it gets very hairy right around
> > /sys/src/cmd/cc/lex.c:751 — and I think there’s a bug.
> 
> you're right, that's wrong.  but the question is do you really want
> that to work?

In kencc, maybe not; in a class project designed to implement a C89 compiler, 
definitely yes.

> in that case, one could always remove the goto ncu on line 757.

cpu% grep -n 'goto ncu;' /sys/src/cmd/cc/lex.c
778:                    goto ncu;
788:            goto ncu;
801:            goto ncu;
808:            goto ncu;
cpu% 

I think you mean the one on 788.  I'm far from comfortable enough with
the code here to suggest a patch, though.  Certainly not comfortable
enough to incorporate it into my lexer.

> however, for better or worse, octal constants start with a 0.  08.7
> feels like a syntax error to me.  i am a little suprised that gcc
> accepts 08.7.  are you sure that that's actually in the standard?

>From the ISO standard (the freely available “draft" C99+TG1+TG2 standard):

6.4.4.2 Floating constants
Syntax
floating-constant:
                decimal-floating-constant
                hexadecimal-floating-constant

decimal-floating-constant:
        fractional-constant exponent-part_{opt} floating-suffix_{opt}
        digit-sequence exponent-part floating-suffix_{opt}
…

fractional-constant:
        digit-sequence_{opt} . digit-sequence
        digit-sequence .
…

digit-sequence:
        digit
        digit-sequence digit


— no restrictions on the initial digit.  You get the same table in
Harbison & Steele, 5th Ed. §2.7.2.

--Joel

Reply via email to