X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-lexer.l;h=12f9e99cfada44ced62420438727997ed686e23c;hp=a282bf7a473d6a8bd04ab3feba5906e801a7a213;hb=80b07bd71464ffbf5f681b7519af520cb0d44d3a;hpb=fd3c708f8ac4cc5782d3b0720c7fd739ba969ff6 diff --git a/formats/ctf/metadata/ctf-lexer.l b/formats/ctf/metadata/ctf-lexer.l index a282bf7a..12f9e99c 100644 --- a/formats/ctf/metadata/ctf-lexer.l +++ b/formats/ctf/metadata/ctf-lexer.l @@ -26,11 +26,22 @@ */ #include +#include #include #include "ctf-scanner.h" #include "ctf-parser.h" #include "ctf-ast.h" +#define PARSE_INTEGER_LITERAL(base) \ + do { \ + errno = 0; \ + yylval->ull = strtoull(yytext, NULL, base); \ + if (errno) { \ + printfl_perror(yylineno, "Integer literal"); \ + return ERROR; \ + } \ + } while (0) + BT_HIDDEN void setstring(struct ctf_scanner *scanner, YYSTYPE *lvalp, const char *src); @@ -47,7 +58,7 @@ int import_string(struct ctf_scanner *scanner, YYSTYPE *lvalp, const char *src, %option reentrant yylineno noyywrap bison-bridge %option extra-type="struct ctf_scanner *" /* bison-locations */ -INTEGER_SUFFIX [ \n\t]*(U|UL|ULL|LU|LLU|Ul|Ull|lU|llU|u|uL|uLL|Lu|LLu|ul|ull|lu|llu) +INTEGER_SUFFIX [ \r\n\t]*(U|UL|ULL|LU|LLU|Ul|Ull|lU|llU|u|uL|uLL|Lu|LLu|ul|ull|lu|llu) DIGIT [0-9] NONDIGIT [a-zA-Z_] HEXDIGIT [0-9A-Fa-f] @@ -122,9 +133,10 @@ void setstring(yyextra, yylval, yytext); return VOID; _Bool setstring(yyextra, yylval, yytext); return _BOOL; _Complex setstring(yyextra, yylval, yytext); return _COMPLEX; _Imaginary setstring(yyextra, yylval, yytext); return _IMAGINARY; -[1-9]{DIGIT}*{INTEGER_SUFFIX}? setstring(yyextra, yylval, yytext); return DECIMAL_CONSTANT; -0{OCTALDIGIT}*{INTEGER_SUFFIX}? setstring(yyextra, yylval, yytext); return OCTAL_CONSTANT; -0[xX]{HEXDIGIT}+{INTEGER_SUFFIX}? setstring(yyextra, yylval, yytext); return HEXADECIMAL_CONSTANT; +[1-9]{DIGIT}*{INTEGER_SUFFIX}? PARSE_INTEGER_LITERAL(10); return INTEGER_LITERAL; +0{OCTALDIGIT}*{INTEGER_SUFFIX}? PARSE_INTEGER_LITERAL(8); return INTEGER_LITERAL; +0[xX]{HEXDIGIT}+{INTEGER_SUFFIX}? PARSE_INTEGER_LITERAL(16); return INTEGER_LITERAL; + {IDENTIFIER} printf_debug("\n", yytext); setstring(yyextra, yylval, yytext); if (is_type(yyextra, yytext)) return ID_TYPE; else return IDENTIFIER; [ \t\r\n] ; /* ignore */ . printfl_error(yylineno, "invalid character '0x%02X'", yytext[0]); return ERROR;