- Handle "? :" conditionals.
- Allow [handle] attribute for types.
This commit is contained in:
parent
a98056191d
commit
7f0abaffe5
|
@ -378,6 +378,15 @@ static void do_write_expr(FILE *h, expr_t *e, int p)
|
|||
do_write_expr(h, e->u.ext, 1);
|
||||
if (p) fprintf(h, ")");
|
||||
break;
|
||||
case EXPR_COND:
|
||||
if (p) fprintf(h, "(");
|
||||
do_write_expr(h, e->ref, 1);
|
||||
fprintf(h, " ? ");
|
||||
do_write_expr(h, e->u.ext, 1);
|
||||
fprintf(h, " : ");
|
||||
do_write_expr(h, e->ext2, 1);
|
||||
if (p) fprintf(h, ")");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -221,6 +221,7 @@ static struct keyword {
|
|||
/* ... */
|
||||
{"float", tFLOAT},
|
||||
/* ... */
|
||||
{"handle", tHANDLE},
|
||||
{"handle_t", tHANDLET},
|
||||
/* ... */
|
||||
{"helpstring", tHELPSTRING},
|
||||
|
|
|
@ -72,6 +72,7 @@ static expr_t *make_exprs(enum expr_type type, char *val);
|
|||
static expr_t *make_exprt(enum expr_type type, typeref_t *tref, expr_t *expr);
|
||||
static expr_t *make_expr1(enum expr_type type, expr_t *expr);
|
||||
static expr_t *make_expr2(enum expr_type type, expr_t *exp1, expr_t *exp2);
|
||||
static expr_t *make_expr3(enum expr_type type, expr_t *exp1, expr_t *exp2, expr_t *exp3);
|
||||
static type_t *make_type(BYTE type, type_t *ref);
|
||||
static typeref_t *make_tref(char *name, type_t *ref);
|
||||
static typeref_t *uniq_tref(typeref_t *ref);
|
||||
|
@ -134,6 +135,7 @@ static type_t std_uhyper = { "MIDL_uhyper" };
|
|||
%token tENTRY tENUM tERRORSTATUST
|
||||
%token tEXTERN
|
||||
%token tFLOAT
|
||||
%token tHANDLE
|
||||
%token tHANDLET
|
||||
%token tHELPSTRING
|
||||
%token tHYPER tID tIDEMPOTENT
|
||||
|
@ -327,6 +329,7 @@ attribute:
|
|||
| tDUAL { $$ = make_attr(ATTR_DUAL); }
|
||||
| tENTRY '(' aSTRING ')' { $$ = make_attrp(ATTR_ENTRY_STRING, $3); }
|
||||
| tENTRY '(' expr_const ')' { $$ = make_attrp(ATTR_ENTRY_ORDINAL, $3); }
|
||||
| tHANDLE { $$ = make_attr(ATTR_HANDLE); }
|
||||
| tHELPSTRING '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRING, $3); }
|
||||
| tID '(' expr_const ')' { $$ = make_attrp(ATTR_ID, $3); }
|
||||
| tIDEMPOTENT { $$ = make_attr(ATTR_IDEMPOTENT); }
|
||||
|
@ -430,6 +433,7 @@ m_expr: { $$ = make_expr(EXPR_VOID); }
|
|||
expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
|
||||
| aHEXNUM { $$ = make_exprl(EXPR_HEXNUM, $1); }
|
||||
| aIDENTIFIER { $$ = make_exprs(EXPR_IDENTIFIER, $1); }
|
||||
| expr '?' expr ':' expr { $$ = make_expr3(EXPR_COND, $1, $3, $5); }
|
||||
| expr '|' expr { $$ = make_expr2(EXPR_OR , $1, $3); }
|
||||
| expr '&' expr { $$ = make_expr2(EXPR_AND, $1, $3); }
|
||||
| expr '+' expr { $$ = make_expr2(EXPR_ADD, $1, $3); }
|
||||
|
@ -884,6 +888,31 @@ static expr_t *make_expr2(enum expr_type type, expr_t *expr1, expr_t *expr2)
|
|||
return e;
|
||||
}
|
||||
|
||||
static expr_t *make_expr3(enum expr_type type, expr_t *expr1, expr_t *expr2, expr_t *expr3)
|
||||
{
|
||||
expr_t *e;
|
||||
e = xmalloc(sizeof(expr_t));
|
||||
e->type = type;
|
||||
e->ref = expr1;
|
||||
e->u.ext = expr2;
|
||||
e->ext2 = expr3;
|
||||
e->is_const = FALSE;
|
||||
INIT_LINK(e);
|
||||
/* check for compile-time optimization */
|
||||
if (expr1->is_const && expr2->is_const && expr3->is_const) {
|
||||
e->is_const = TRUE;
|
||||
switch (type) {
|
||||
case EXPR_COND:
|
||||
e->cval = expr1->cval ? expr2->cval : expr3->cval;
|
||||
break;
|
||||
default:
|
||||
e->is_const = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return e;
|
||||
}
|
||||
|
||||
static type_t *make_type(BYTE type, type_t *ref)
|
||||
{
|
||||
type_t *t = xmalloc(sizeof(type_t));
|
||||
|
|
|
@ -62,6 +62,7 @@ enum attr_type
|
|||
ATTR_DUAL,
|
||||
ATTR_ENTRY_STRING,
|
||||
ATTR_ENTRY_ORDINAL,
|
||||
ATTR_HANDLE,
|
||||
ATTR_HELPSTRING,
|
||||
ATTR_ID,
|
||||
ATTR_IDEMPOTENT,
|
||||
|
@ -109,6 +110,7 @@ enum expr_type
|
|||
EXPR_SUB,
|
||||
EXPR_AND,
|
||||
EXPR_OR,
|
||||
EXPR_COND,
|
||||
};
|
||||
|
||||
struct _attr_t {
|
||||
|
@ -130,6 +132,7 @@ struct _expr_t {
|
|||
expr_t *ext;
|
||||
typeref_t *tref;
|
||||
} u;
|
||||
expr_t *ext2;
|
||||
int is_const;
|
||||
long cval;
|
||||
/* parser-internal */
|
||||
|
|
Loading…
Reference in New Issue