diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 75cdae22550..1e7c543e8af 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -154,10 +154,11 @@ static int token_str( int token, const char *str, YYSTYPE *yylval ) return token; } -static int token_num( int token, const char *yytext, YYSTYPE *yylval ) +static int token_num( const char *yytext, YYSTYPE *yylval, int is_hex ) { - yylval->num = xstrtoul( yytext, NULL, 0 ); - return token; + yylval->integer.value = xstrtoul( yytext, NULL, 0 ); + yylval->integer.is_hex = is_hex; + return is_hex ? aHEXNUM : aNUM; } static int token_ident( const char *str, YYSTYPE *yylval ) @@ -431,8 +432,8 @@ SAFEARRAY{ws}*/\( return tSAFEARRAY; [a-zA-Z_][0-9a-zA-Z_]* { return token_ident( yytext, yylval ); } - 0[xX]{hd}+[uU]?[lL]? { return token_num( aHEXNUM, yytext, yylval ); } - [0-9]+[uU]?[lL]? { return token_num( aNUM, yytext, yylval ); } + 0[xX]{hd}+[uU]?[lL]? { return token_num( yytext, yylval, TRUE ); } + [0-9]+[uU]?[lL]? { return token_num( yytext, yylval, FALSE ); } L\"(\\.|[^"\\])*\" { return token_str( aWSTRING, yytext + 1, yylval ); } \"(\\.|[^"\\])*\" { return token_str( aSTRING, yytext, yylval ); } diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 3d64587d526..062edfd2079 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -151,6 +151,7 @@ PARSER_LTYPE pop_import(void); char *str; struct uuid *uuid; unsigned int num; + struct integer integer; double dbl; typelib_t *typelib; struct _import_t *import; @@ -163,7 +164,7 @@ PARSER_LTYPE pop_import(void); %token aIDENTIFIER aPRAGMA %token aKNOWNTYPE -%token aNUM aHEXNUM +%token aNUM aHEXNUM %token aDOUBLE %token aSTRING aWSTRING aSQSTRING %token tCDECL @@ -494,8 +495,8 @@ pragma_warning: tPRAGMA_WARNING '(' aIDENTIFIER ':' warnings ')' ; warnings: - aNUM { $$ = append_warning(NULL, $1); } - | warnings aNUM { $$ = append_warning($1, $2); } + aNUM { $$ = append_warning(NULL, $1.value); } + | warnings aNUM { $$ = append_warning($1, $2.value); } ; typedecl: @@ -591,8 +592,8 @@ marshaling_behavior: ; contract_ver: - aNUM { $$ = MAKEVERSION(0, $1); } - | aNUM '.' aNUM { $$ = MAKEVERSION($3, $1); } + aNUM { $$ = MAKEVERSION(0, $1.value); } + | aNUM '.' aNUM { $$ = MAKEVERSION($3.value, $1.value); } ; contract_req @@ -844,10 +845,8 @@ m_expr | expr ; -expr: aNUM { struct integer integer = {.value = $1}; - $$ = make_exprl(EXPR_NUM, &integer); } - | aHEXNUM { struct integer integer = {.value = $1, .is_hex = TRUE}; - $$ = make_exprl(EXPR_NUM, &integer); } +expr: aNUM { $$ = make_exprl(EXPR_NUM, &$1); } + | aHEXNUM { $$ = make_exprl(EXPR_NUM, &$1); } | aDOUBLE { $$ = make_exprd(EXPR_DOUBLE, $1); } | tFALSE { struct integer integer = {.value = 0}; $$ = make_exprl(EXPR_TRUEFALSE, &integer); } @@ -1385,9 +1384,9 @@ uniondef: tUNION m_typename '{' ne_union_fields '}' ; version: - aNUM { $$ = MAKEVERSION($1, 0); } - | aNUM '.' aNUM { $$ = MAKEVERSION($1, $3); } - | aHEXNUM { $$ = $1; } + aNUM { $$ = MAKEVERSION($1.value, 0); } + | aNUM '.' aNUM { $$ = MAKEVERSION($1.value, $3.value); } + | aHEXNUM { $$ = $1.value; } ; acf_statements