X-Git-Url: http://deadsoftware.ru/gitweb?p=dsw-obn.git;a=blobdiff_plain;f=src%2Foberon.c;h=6aa94d602fd9da13bb67174ecf2dc6632f9c2d4a;hp=0118ff9bfceded3989c464ed1a6f9fb59645a6be;hb=5eab721345c3e472bbfbb97645729069b0b6bb40;hpb=90882596d1b4b9ef59880c878118e4f9da49eede diff --git a/src/oberon.c b/src/oberon.c index 0118ff9..6aa94d6 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -1159,7 +1159,8 @@ oberon_make_record_selector(oberon_context_t * ctx, oberon_expr_t * expr, char * #define ISSELECTOR(x) \ (((x) == LBRACE) \ || ((x) == DOT) \ - || ((x) == UPARROW)) + || ((x) == UPARROW) \ + || ((x) == LPAREN)) static oberon_object_t * oberon_qualident(oberon_context_t * ctx, char ** xname, int check) @@ -1194,6 +1195,18 @@ oberon_qualident(oberon_context_t * ctx, char ** xname, int check) return x; } +static oberon_expr_t * +oberno_make_record_cast(oberon_context_t * ctx, oberon_expr_t * expr, oberon_type_t * rec) +{ + if(expr -> result -> class != OBERON_TYPE_RECORD + || rec -> class != OBERON_TYPE_RECORD) + { + oberon_error(ctx, "must be record type"); + } + + return oberon_cast_expr(ctx, expr, rec); +} + static oberon_expr_t * oberon_designator(oberon_context_t * ctx) { @@ -1258,6 +1271,16 @@ oberon_designator(oberon_context_t * ctx) oberon_assert_token(ctx, UPARROW); expr = oberno_make_dereferencing(ctx, expr); break; + case LPAREN: + oberon_assert_token(ctx, LPAREN); + oberon_object_t * objtype = oberon_qualident(ctx, NULL, 1); + if(objtype -> class != OBERON_CLASS_TYPE) + { + oberon_error(ctx, "must be type"); + } + oberon_assert_token(ctx, RPAREN); + expr = oberno_make_record_cast(ctx, expr, objtype -> type); + break; default: oberon_error(ctx, "oberon_designator: wat"); break;