Rob Shearman : widl: Add support for "->" and "." operators in expressions.
Alexandre Julliard
julliard at winehq.org
Mon Apr 21 07:46:18 CDT 2008
Module: wine
Branch: master
Commit: 03d5017416adfd47fe86d8ecf97af8a028ca7748
URL: http://source.winehq.org/git/wine.git/?a=commit;h=03d5017416adfd47fe86d8ecf97af8a028ca7748
Author: Rob Shearman <rob at codeweavers.com>
Date: Sun Apr 20 22:15:43 2008 +0100
widl: Add support for "->" and "." operators in expressions.
---
tools/widl/header.c | 4 ++++
tools/widl/parser.l | 1 +
tools/widl/parser.y | 6 +++++-
tools/widl/typegen.c | 6 ++++++
tools/widl/widltypes.h | 2 ++
5 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index 3c89d61..d2f7ca7 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -526,6 +526,8 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
case EXPR_SUB:
case EXPR_AND:
case EXPR_OR:
+ case EXPR_MEMBERPTR:
+ case EXPR_MEMBER:
if (brackets) fprintf(h, "(");
write_expr(h, e->ref, 1);
switch (e->type) {
@@ -537,6 +539,8 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
case EXPR_SUB: fprintf(h, " - "); break;
case EXPR_AND: fprintf(h, " & "); break;
case EXPR_OR: fprintf(h, " | "); break;
+ case EXPR_MEMBERPTR: fprintf(h, "->"); break;
+ case EXPR_MEMBER: fprintf(h, "."); break;
default: break;
}
write_expr(h, e->u.ext, 1);
diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index 5b24b26..3439ea6 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -162,6 +162,7 @@ SAFEARRAY{ws}*/\( return tSAFEARRAY;
<INITIAL,ATTR>{ws}
<INITIAL,ATTR>\<\< return SHL;
<INITIAL,ATTR>\>\> return SHR;
+<INITIAL,ATTR>\-\> return MEMBERPTR;
<INITIAL,ATTR>. return yytext[0];
<<EOF>> {
if (import_stack_ptr)
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index c7fbe42..61a1252 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -180,6 +180,7 @@ static void add_explicit_handle_if_necessary(func_t *func);
%token <uuid> aUUID
%token aEOF
%token SHL SHR
+%token MEMBERPTR
%token tAGGREGATABLE tALLOCATE tAPPOBJECT tASYNC tASYNCUUID
%token tAUTOHANDLE tBINDABLE tBOOLEAN tBROADCAST tBYTE tBYTECOUNT
%token tCALLAS tCALLBACK tCASE tCDECL tCHAR tCOCLASS tCODE tCOMMSTATUS
@@ -294,6 +295,7 @@ static void add_explicit_handle_if_necessary(func_t *func);
%left '-' '+'
%left '*' '/'
%left SHL SHR
+%left '.' MEMBERPTR
%right '~'
%right CAST
%right PPTR
@@ -636,8 +638,10 @@ expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
| expr SHR expr { $$ = make_expr2(EXPR_SHR, $1, $3); }
| '~' expr { $$ = make_expr1(EXPR_NOT, $2); }
| '-' expr %prec NEG { $$ = make_expr1(EXPR_NEG, $2); }
- | '&' expr %prec ADDRESSOF { $$ = make_expr1(EXPR_ADDRESSOF, $2); }
+ | '&' expr %prec ADDRESSOF { $$ = make_expr1(EXPR_ADDRESSOF, $2); }
| '*' expr %prec PPTR { $$ = make_expr1(EXPR_PPTR, $2); }
+ | expr MEMBERPTR expr { $$ = make_expr2(EXPR_MEMBERPTR, $1, $3); }
+ | expr '.' expr { $$ = make_expr2(EXPR_MEMBER, $1, $3); }
| '(' type ')' expr %prec CAST { $$ = make_exprt(EXPR_CAST, $2, $4); }
| tSIZEOF '(' type ')' { $$ = make_exprt(EXPR_SIZEOF, $3, NULL); }
| '(' expr ')' { $$ = $2; }
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 32e557f..b298403 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -356,6 +356,8 @@ static int compare_expr(const expr_t *a, const expr_t *b)
case EXPR_DIV:
case EXPR_SHL:
case EXPR_SHR:
+ case EXPR_MEMBERPTR:
+ case EXPR_MEMBER:
ret = compare_expr(a->ref, b->ref);
if (ret != 0)
return ret;
@@ -3151,6 +3153,8 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
case EXPR_SUB:
case EXPR_AND:
case EXPR_OR:
+ case EXPR_MEMBERPTR:
+ case EXPR_MEMBER:
if (brackets) fprintf(h, "(");
write_struct_expr(h, e->ref, 1, fields, structvar);
switch (e->type) {
@@ -3162,6 +3166,8 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
case EXPR_SUB: fprintf(h, " - "); break;
case EXPR_AND: fprintf(h, " & "); break;
case EXPR_OR: fprintf(h, " | "); break;
+ case EXPR_MEMBERPTR: fprintf(h, "->"); break;
+ case EXPR_MEMBER: fprintf(h, "."); break;
default: break;
}
write_struct_expr(h, e->u.ext, 1, fields, structvar);
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index dfae4dd..256a3ad 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -161,6 +161,8 @@ enum expr_type
EXPR_COND,
EXPR_TRUEFALSE,
EXPR_ADDRESSOF,
+ EXPR_MEMBERPTR,
+ EXPR_MEMBER,
};
enum type_kind
More information about the wine-cvs
mailing list