diff options
Diffstat (limited to 'src/map/magic-interpreter-parser.y')
-rw-r--r-- | src/map/magic-interpreter-parser.y | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/map/magic-interpreter-parser.y b/src/map/magic-interpreter-parser.y index bae6844..deb686d 100644 --- a/src/map/magic-interpreter-parser.y +++ b/src/map/magic-interpreter-parser.y @@ -12,6 +12,9 @@ intern_id(char *id_name); static expr_t * fun_expr(char *name, int args_nr, expr_t **args, int line, int column); +static expr_t * +dot_expr(expr_t *lhs, int id); + #define BIN_EXPR(x, name, arg1, arg2, line, column) { expr_t *e[2]; e[0] = arg1; e[1] = arg2; x = fun_expr(name, 2, e, line, column); } static int failed_flag = 0; @@ -106,6 +109,7 @@ find_constant(char *name); %token '%' %token '@' %token ',' +%token '.' %token ':' %token ';' %token '|' @@ -200,6 +204,7 @@ find_constant(char *name); %right '=' %left OR %left DARROW +%left '.' %% @@ -394,6 +399,8 @@ expr : value free($1); } | '(' expr ')' { $$ = $2; } + | expr '.' ID + { $$ = dot_expr($1, intern_id($3)); } ; arg_list : /* empty */ @@ -769,6 +776,16 @@ fail(int line, int column, char *fmt, ...) } static expr_t * +dot_expr(expr_t *expr, int id) +{ + expr_t *retval = magic_new_expr(EXPR_SPELLFIELD); + retval->e.e_field.id = id; + retval->e.e_field.expr = expr; + + return retval; +} + +static expr_t * fun_expr(char *name, int args_nr, expr_t **args, int line, int column) { int id; @@ -804,7 +821,10 @@ fun_expr(char *name, int args_nr, expr_t **args, int line, int column) static spell_t * new_spell(spellguard_t *guard) { + static int spell_counter = 0; + spell_t *retval = calloc(1, sizeof(spell_t)); + retval->index = ++spell_counter; retval->spellguard = guard; return retval; } |