tools/widl: Split expr_int_const off from expr

Gerald Pfeifer gerald at pfeifer.com
Sun Jun 28 16:43:41 CDT 2009


I am working to remove the cpp_quote hacks from include/wine/wined3d.idl
which needs some (minor) enhancements to widl.  The one thing that is
getting in the way of that is that right now expr_int_const basically
is the same as expr with an additional check.  This makes adding finer
productions barely feasible.

So, this patch really splits expr_int_const out from expr and makes expr 
then use the "true" expr_int_const in turn.  There is one production -- 
the one with '(' expr ')' -- which is not perfectly clean yet, but it is
good enough and survives a full Wine build.

Gerald

ChangeLog:
Split expr_int_const off from expr.

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index c2f1abc..01aa060 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -622,56 +633,54 @@ m_expr:						{ $$ = make_expr(EXPR_VOID); }
 	| expr
 	;
 
-expr:	  aNUM					{ $$ = make_exprl(EXPR_NUM, $1); }
-	| aHEXNUM				{ $$ = make_exprl(EXPR_HEXNUM, $1); }
+expr:	expr_int_const
 	| aDOUBLE				{ $$ = make_exprd(EXPR_DOUBLE, $1); }
+	| '-' aDOUBLE				{ $$ = make_exprd(EXPR_DOUBLE, -($2)); }
 	| tFALSE				{ $$ = make_exprl(EXPR_TRUEFALSE, 0); }
-	| tNULL					{ $$ = make_exprl(EXPR_NUM, 0); }
 	| tTRUE					{ $$ = make_exprl(EXPR_TRUEFALSE, 1); }
 	| aSTRING				{ $$ = make_exprs(EXPR_STRLIT, $1); }
 	| aWSTRING				{ $$ = make_exprs(EXPR_WSTRLIT, $1); }
-	| aIDENTIFIER				{ $$ = make_exprs(EXPR_IDENTIFIER, $1); }
 	| expr '?' expr ':' expr		{ $$ = make_expr3(EXPR_COND, $1, $3, $5); }
 	| expr LOGICALOR expr			{ $$ = make_expr2(EXPR_LOGOR, $1, $3); }
 	| expr LOGICALAND expr			{ $$ = make_expr2(EXPR_LOGAND, $1, $3); }
-	| expr '|' expr				{ $$ = make_expr2(EXPR_OR , $1, $3); }
-	| expr '^' expr				{ $$ = make_expr2(EXPR_XOR, $1, $3); }
-	| expr '&' expr				{ $$ = make_expr2(EXPR_AND, $1, $3); }
 	| expr EQUALITY expr			{ $$ = make_expr2(EXPR_EQUALITY, $1, $3); }
 	| expr INEQUALITY expr			{ $$ = make_expr2(EXPR_INEQUALITY, $1, $3); }
 	| expr '>' expr				{ $$ = make_expr2(EXPR_GTR, $1, $3); }
 	| expr '<' expr				{ $$ = make_expr2(EXPR_LESS, $1, $3); }
 	| expr GREATEREQUAL expr		{ $$ = make_expr2(EXPR_GTREQL, $1, $3); }
 	| expr LESSEQUAL expr			{ $$ = make_expr2(EXPR_LESSEQL, $1, $3); }
-	| expr SHL expr				{ $$ = make_expr2(EXPR_SHL, $1, $3); }
-	| expr SHR expr				{ $$ = make_expr2(EXPR_SHR, $1, $3); }
-	| expr '+' expr				{ $$ = make_expr2(EXPR_ADD, $1, $3); }
-	| expr '-' expr				{ $$ = make_expr2(EXPR_SUB, $1, $3); }
-	| expr '%' expr				{ $$ = make_expr2(EXPR_MOD, $1, $3); }
-	| expr '*' expr				{ $$ = make_expr2(EXPR_MUL, $1, $3); }
-	| expr '/' expr				{ $$ = make_expr2(EXPR_DIV, $1, $3); }
 	| '!' expr				{ $$ = make_expr1(EXPR_LOGNOT, $2); }
-	| '~' expr				{ $$ = make_expr1(EXPR_NOT, $2); }
-	| '+' expr %prec POS			{ $$ = make_expr1(EXPR_POS, $2); }
-	| '-' expr %prec NEG			{ $$ = make_expr1(EXPR_NEG, $2); }
 	| '&' expr %prec ADDRESSOF		{ $$ = make_expr1(EXPR_ADDRESSOF, $2); }
 	| '*' expr %prec PPTR			{ $$ = make_expr1(EXPR_PPTR, $2); }
 	| expr MEMBERPTR aIDENTIFIER		{ $$ = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, $1), make_exprs(EXPR_IDENTIFIER, $3)); }
 	| expr '.' aIDENTIFIER			{ $$ = make_expr2(EXPR_MEMBER, $1, make_exprs(EXPR_IDENTIFIER, $3)); }
 	| '(' type ')' expr %prec CAST		{ $$ = make_exprt(EXPR_CAST, $2, $4); }
-	| tSIZEOF '(' type ')'			{ $$ = make_exprt(EXPR_SIZEOF, $3, NULL); }
 	| expr '[' expr ']'			{ $$ = make_expr2(EXPR_ARRAY, $1, $3); }
-	| '(' expr ')'				{ $$ = $2; }
 	;
 
 expr_list_int_const: expr_int_const		{ $$ = append_expr( NULL, $1 ); }
 	| expr_list_int_const ',' expr_int_const	{ $$ = append_expr( $1, $3 ); }
 	;
 
-expr_int_const: expr				{ $$ = $1;
-						  if (!$$->is_const)
-						      error_loc("expression is not an integer constant\n");
-						}
+expr_int_const: aNUM				{ $$ = make_exprl(EXPR_NUM, $1); }
+	| aHEXNUM				{ $$ = make_exprl(EXPR_HEXNUM, $1); }
+	| tNULL					{ $$ = make_exprl(EXPR_NUM, 0); } 
+	| aIDENTIFIER				{ $$ = make_exprs(EXPR_IDENTIFIER, $1); }
+	| '~' expr_int_const	 		{ $$ = make_expr1(EXPR_NOT, $2); }
+	| '+' expr_int_const %prec POS		{ $$ = make_expr1(EXPR_POS, $2); }
+	| '-' expr_int_const %prec NEG		{ $$ = make_expr1(EXPR_NEG, $2); }
+	| expr_int_const SHL expr_int_const	{ $$ = make_expr2(EXPR_SHL, $1, $3); }
+	| expr_int_const SHR expr_int_const	{ $$ = make_expr2(EXPR_SHR, $1, $3); }
+	| expr_int_const '+' expr_int_const	{ $$ = make_expr2(EXPR_ADD, $1, $3); }
+	| expr_int_const '-' expr_int_const	{ $$ = make_expr2(EXPR_SUB, $1, $3); }
+	| expr_int_const '%' expr_int_const	{ $$ = make_expr2(EXPR_MOD, $1, $3); }
+	| expr_int_const '*' expr_int_const	{ $$ = make_expr2(EXPR_MUL, $1, $3); }
+	| expr_int_const '/' expr_int_const	{ $$ = make_expr2(EXPR_DIV, $1, $3); }
+	| expr_int_const '|' expr_int_const	{ $$ = make_expr2(EXPR_OR , $1, $3); }
+	| expr_int_const '^' expr_int_const	{ $$ = make_expr2(EXPR_XOR, $1, $3); }
+	| expr_int_const '&' expr_int_const	{ $$ = make_expr2(EXPR_AND, $1, $3); }
+	| tSIZEOF '(' type ')'			{ $$ = make_exprt(EXPR_SIZEOF, $3, NULL); }
+	| '(' expr ')'				{ $$ = $2; }
 	;
 
 expr_const: expr				{ $$ = $1;



More information about the wine-patches mailing list