Add support for octal and hexadecimal integer literals.
authorCarl Worth <cworth@cworth.org>
Mon, 24 May 2010 18:29:02 +0000 (11:29 -0700)
committerCarl Worth <cworth@cworth.org>
Mon, 24 May 2010 18:29:02 +0000 (11:29 -0700)
In addition to the decimal literals which we already support. Note
that we use strtoll here to get the large-width integers demanded by
the specification.

glcpp-lex.l

index fe95508..ee1f6e3 100644 (file)
@@ -45,10 +45,13 @@ NONSPACE    [^[:space:]]
 NEWLINE                [\n]
 HSPACE         [ \t]
 HASH           ^{HSPACE}*#{HSPACE}*
-INTEGER                [0-9]+
 IDENTIFIER     [_a-zA-Z][_a-zA-Z0-9]*
 TOKEN          [^[:space:](),]+
 
+DECIMAL_INTEGER                [1-9][0-9]*[uU]?
+OCTAL_INTEGER          0[0-7]*[uU]?
+HEXADECIMAL_INTEGER    0[xX][0-9a-fA-F]+[uU]?
+
 %%
 
 {HASH}if{HSPACE}* {
@@ -61,8 +64,18 @@ TOKEN                [^[:space:](),]+
        return ELIF;
 }
 
-<ST_IF>{INTEGER} {
-       yylval.ival = atoi (yytext);
+<ST_IF>{DECIMAL_INTEGER} {
+       yylval.ival = strtoll (yytext, NULL, 10);
+       return INTEGER;
+}
+
+<ST_IF>{OCTAL_INTEGER} {
+       yylval.ival = strtoll (yytext + 1, NULL, 8);
+       return INTEGER;
+}
+
+<ST_IF>{HEXADECIMAL_INTEGER} {
+       yylval.ival = strtoll (yytext + 2, NULL, 16);
        return INTEGER;
 }