2009/6/28 Gerald Pfeifer <gerald(a)pfeifer.com>:
> 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)); }
This is covered by the production for the binary minus operator that
already exists, so I'm not sure what you're trying to achieve here.
> Â Â Â Â | 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); }
aIDENTIFIER isn't necessarily a constant expression.
> +    | '~' 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); }
Using "expr_int_const" instead of "expr" here prevents a many forms of
expressions from being parsed.
> + Â Â Â | tSIZEOF '(' type ')' Â Â Â Â Â Â Â Â Â { $$ = make_exprt(EXPR_SIZEOF, $3, NULL); }
> + Â Â Â | '(' expr ')' Â Â Â Â Â Â Â Â Â Â Â Â Â { $$ = $2; }
> Â Â Â Â ;
>
>  expr_const: expr                { $$ = $1;
It looks like you'll have to find another way of fixing the issue you
are trying to fix.
--
Rob Shearman