From 03f6d5d2d4a6c42a197ee8eb4e26b87c87bbe43e Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Mon, 24 May 2010 11:29:02 -0700 Subject: [PATCH] Add support for octal and hexadecimal integer literals. 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 | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/glcpp-lex.l b/glcpp-lex.l index fe95508a321..ee1f6e3aeea 100644 --- a/glcpp-lex.l +++ b/glcpp-lex.l @@ -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; } -{INTEGER} { - yylval.ival = atoi (yytext); +{DECIMAL_INTEGER} { + yylval.ival = strtoll (yytext, NULL, 10); + return INTEGER; +} + +{OCTAL_INTEGER} { + yylval.ival = strtoll (yytext + 1, NULL, 8); + return INTEGER; +} + +{HEXADECIMAL_INTEGER} { + yylval.ival = strtoll (yytext + 2, NULL, 16); return INTEGER; } -- 2.30.2