diff options
Diffstat (limited to 'src/map/magic-interpreter-parser.ypp')
-rw-r--r-- | src/map/magic-interpreter-parser.ypp | 149 |
1 files changed, 82 insertions, 67 deletions
diff --git a/src/map/magic-interpreter-parser.ypp b/src/map/magic-interpreter-parser.ypp index b6486f1..a8db8a4 100644 --- a/src/map/magic-interpreter-parser.ypp +++ b/src/map/magic-interpreter-parser.ypp @@ -23,7 +23,14 @@ expr_t *fun_expr(const char *name, int args_nr, expr_t **args, int line, int col 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 +void BIN_EXPR(expr_t *& x, const char *name, expr_t *arg1, expr_t *arg2, int line, int column) +{ + expr_t *e[2]; + e[0] = arg1; + e[1] = arg2; + x = fun_expr(name, 2, e, line, column); +} static int failed_flag = 0; @@ -44,7 +51,7 @@ static spellguard_t *new_spellguard(SPELLGUARD ty); static -effect_t *new_effect(EFFECT_ ty); +effect_t *new_effect(EFFECT ty); static effect_t *set_effect_continuation(effect_t *src, effect_t *continuation); @@ -161,7 +168,7 @@ val_t *find_constant(char *name); %token SKIP %token ABORT %token BREAK -%token EFFECT +%token EFFECT_ %token ATEND %token ATTRIGGER %token PC_F @@ -308,24 +315,24 @@ spellconf_option : ID '=' expr spell_flags : /* empty */ { $$ = SPELL_FLAG::ZERO; } | LOCAL spell_flags - { if (bool($2 & SPELL_FLAG_LOCAL)) + { if (bool($2 & SPELL_FLAG::LOCAL)) fail(@1.first_line, @1.first_column, "`LOCAL' specified more than once"); - $$ = $2 | SPELL_FLAG_LOCAL; + $$ = $2 | SPELL_FLAG::LOCAL; } | NONMAGIC spell_flags - { if (bool($2 & SPELL_FLAG_NONMAGIC)) + { if (bool($2 & SPELL_FLAG::NONMAGIC)) fail(@1.first_line, @1.first_column, "`NONMAGIC' specified more than once"); - $$ = $2 | SPELL_FLAG_NONMAGIC; + $$ = $2 | SPELL_FLAG::NONMAGIC; } | SILENT spell_flags - { if (bool($2 & SPELL_FLAG_SILENT)) + { if (bool($2 & SPELL_FLAG::SILENT)) fail(@1.first_line, @1.first_column, "`SILENT' specified more than once"); - $$ = $2 | SPELL_FLAG_SILENT; + $$ = $2 | SPELL_FLAG::SILENT; } argopt : /* empty */ - { $$.ty = SPELLARG_NONE; } + { $$.ty = SPELLARG::NONE; } | '(' ID ':' arg_ty ')' { $$.id = intern_id($2); $$.ty = $4; } @@ -333,40 +340,40 @@ argopt : /* empty */ arg_ty : PC_F - { $$ = SPELLARG_PC; } + { $$ = SPELLARG::PC; } | STRING_TY - { $$ = SPELLARG_STRING; } + { $$ = SPELLARG::STRING; } ; value : DIR - { $$.ty = TY_DIR; + { $$.ty = TYPE::DIR; $$.v.v_int = $1; } | INT - { $$.ty = TY_INT; + { $$.ty = TYPE::INT; $$.v.v_int = $1; } | STRING - { $$.ty = TY_STRING; + { $$.ty = TYPE::STRING; $$.v.v_string = $1; } ; expr : value - { $$ = magic_new_expr(EXPR_VAL); + { $$ = magic_new_expr(EXPR::VAL); $$->e.e_val = $1; } | ID { val_t *val; if ((val = find_constant($1))) { - $$ = magic_new_expr(EXPR_VAL); + $$ = magic_new_expr(EXPR::VAL); $$->e.e_val = *val; } else { - $$ = magic_new_expr(EXPR_ID); + $$ = magic_new_expr(EXPR::ID); $$->e.e_id = intern_id($1); } } | area - { $$ = magic_new_expr(EXPR_AREA); + { $$ = magic_new_expr(EXPR::AREA); $$->e.e_area = $1; } | expr '+' expr { BIN_EXPR($$, "+", $1, $3, @1.first_line, @1.first_column); } @@ -442,17 +449,17 @@ location : '@' '(' expr ',' expr ',' expr ')' ; area : location - { $$.ty = AREA_LOCATION; + { $$.ty = AREA::LOCATION; $$.a.a_loc = $1; } | location '@' '+' '(' expr ',' expr ')' - { $$.ty = AREA_RECT; + { $$.ty = AREA::RECT; $$.a.a_rect.loc = $1; $$.a.a_rect.width = $5; $$.a.a_rect.height = $7; } | location TOWARDS expr ':' '(' expr ',' expr ')' - { $$.ty = AREA_BAR; + { $$.ty = AREA::BAR; $$.a.a_bar.loc = $1; $$.a.a_bar.width = $6; $$.a.a_bar.depth = $8; @@ -501,7 +508,7 @@ def : ID '=' expr spellbody_list : spellbody { $$ = $1; } | spellbody '|' spellbody_list - { spellguard_t *sg = new_spellguard(SPELLGUARD_CHOICE); + { spellguard_t *sg = new_spellguard(SPELLGUARD::CHOICE); sg->next = $1; sg->s.s_alt = $3; $$ = sg; @@ -513,8 +520,8 @@ spellbody : spellguard DARROW spellbody { $$ = spellguard_implication($1, $3); } | '(' spellbody_list ')' { $$ = $2; } - | EFFECT effect_list maybe_trigger maybe_end - { spellguard_t *sg = new_spellguard(SPELLGUARD_EFFECT); + | EFFECT_ effect_list maybe_trigger maybe_end + { spellguard_t *sg = new_spellguard(SPELLGUARD::EFFECT); sg->s.s_effect.effect = $2; sg->s.s_effect.at_trigger = $3; sg->s.s_effect.at_end = $4; @@ -540,7 +547,7 @@ maybe_end : /* empty */ spellguard : prereq { $$ = $1; } | spellguard OR spellguard - { spellguard_t *sg = new_spellguard(SPELLGUARD_CHOICE); + { spellguard_t *sg = new_spellguard(SPELLGUARD::CHOICE); sg->next = $1; sg->s.s_alt = $3; $$ = sg; @@ -558,23 +565,23 @@ spellguard_list : spellguard prereq : REQUIRE expr - { $$ = new_spellguard(SPELLGUARD_CONDITION); + { $$ = new_spellguard(SPELLGUARD::CONDITION); $$->s.s_condition = $2; } | CATALYSTS items - { $$ = new_spellguard(SPELLGUARD_CATALYSTS); + { $$ = new_spellguard(SPELLGUARD::CATALYSTS); $$->s.s_catalysts = $2; } | COMPONENTS items - { $$ = new_spellguard(SPELLGUARD_COMPONENTS); + { $$ = new_spellguard(SPELLGUARD::COMPONENTS); $$->s.s_components = $2; } | MANA expr - { $$ = new_spellguard(SPELLGUARD_MANA); + { $$ = new_spellguard(SPELLGUARD::MANA); $$->s.s_mana = $2; } | CASTTIME expr - { $$ = new_spellguard(SPELLGUARD_CASTTIME); + { $$ = new_spellguard(SPELLGUARD::CASTTIME); $$->s.s_casttime = $2; } ; @@ -618,69 +625,69 @@ item_name : STRING selection : PC_F - { $$ = FOREACH_FILTER_PC; } + { $$ = FOREACH_FILTER::PC; } | MOB_F - { $$ = FOREACH_FILTER_MOB; } + { $$ = FOREACH_FILTER::MOB; } | ENTITY_F - { $$ = FOREACH_FILTER_ENTITY; } + { $$ = FOREACH_FILTER::ENTITY; } | SPELL - { $$ = FOREACH_FILTER_SPELL; } + { $$ = FOREACH_FILTER::SPELL; } | TARGET_F - { $$ = FOREACH_FILTER_TARGET; } + { $$ = FOREACH_FILTER::TARGET; } | NPC_F - { $$ = FOREACH_FILTER_NPC; } + { $$ = FOREACH_FILTER::NPC; } ; effect : '(' effect_list ')' { $$ = $2; } | SKIP ';' - { $$ = new_effect(EFFECT_SKIP); } + { $$ = new_effect(EFFECT::SKIP); } | ABORT ';' - { $$ = new_effect(EFFECT_ABORT); } + { $$ = new_effect(EFFECT::ABORT); } | END ';' - { $$ = new_effect(EFFECT_END); } + { $$ = new_effect(EFFECT::END); } | BREAK ';' - { $$ = new_effect(EFFECT_BREAK); } + { $$ = new_effect(EFFECT::BREAK); } | ID '=' expr ';' { if (find_constant($1)) { fail(@1.first_line, @1.first_column, "Attempt to re-define constant `%s' in assignment.", $1); free($1); } else { - $$ = new_effect(EFFECT_ASSIGN); + $$ = new_effect(EFFECT::ASSIGN); $$->e.e_assign.id = intern_id($1); $$->e.e_assign.expr = $3; } } | FOREACH selection ID IN expr DO effect - { $$ = new_effect(EFFECT_FOREACH); + { $$ = new_effect(EFFECT::FOREACH); $$->e.e_foreach.id = intern_id($3); $$->e.e_foreach.area = $5; $$->e.e_foreach.body = $7; $$->e.e_foreach.filter = $2; } | FOR ID '=' expr TO expr DO effect - { $$ = new_effect(EFFECT_FOR); + { $$ = new_effect(EFFECT::FOR); $$->e.e_for.id = intern_id($2); $$->e.e_for.start = $4; $$->e.e_for.stop = $6; $$->e.e_for.body = $8; } | IF expr THEN effect ELSE effect - { $$ = new_effect(EFFECT_IF); + { $$ = new_effect(EFFECT::IF); $$->e.e_if.cond = $2; $$->e.e_if.true_branch = $4; $$->e.e_if.false_branch = $6; } | IF expr THEN effect - { $$ = new_effect(EFFECT_IF); + { $$ = new_effect(EFFECT::IF); $$->e.e_if.cond = $2; $$->e.e_if.true_branch = $4; - $$->e.e_if.false_branch = new_effect(EFFECT_SKIP); + $$->e.e_if.false_branch = new_effect(EFFECT::SKIP); } | SLEEP expr ';' - { $$ = new_effect(EFFECT_SLEEP); + { $$ = new_effect(EFFECT::SLEEP); $$->e.e_sleep = $2; } | ID '(' arg_list ')' ';' @@ -688,7 +695,7 @@ effect : '(' effect_list ')' free($1); } | SCRIPT_DATA - { $$ = new_effect(EFFECT_SCRIPT); + { $$ = new_effect(EFFECT::SCRIPT); $$->e.e_script = parse_script($1, @1.first_line); free($1); if ($$->e.e_script == NULL) @@ -701,7 +708,7 @@ effect : '(' effect_list ')' ; effect_list : /* empty */ - { $$ = new_effect(EFFECT_SKIP); } + { $$ = new_effect(EFFECT::SKIP); } | effect semicolons effect_list { $$ = set_effect_continuation($1, $3); } ; @@ -728,7 +735,7 @@ int intern_id(const char *id_name) RECREATE(magic_conf.var_name, const char *, magic_conf.vars_nr); magic_conf.var_name[i] = id_name; RECREATE(magic_conf.vars, val_t, magic_conf.vars_nr); - magic_conf.vars[i].ty = TY_UNDEF; + magic_conf.vars[i].ty = TYPE::UNDEF; return i; } @@ -795,7 +802,7 @@ void fail(int line, int column, const char *fmt, ...) static expr_t *dot_expr(expr_t *expr, int id) { - expr_t *retval = magic_new_expr(EXPR_SPELLFIELD); + expr_t *retval = magic_new_expr(EXPR::SPELLFIELD); retval->e.e_field.id = id; retval->e.e_field.expr = expr; @@ -819,7 +826,7 @@ expr_t *fun_expr(const char *name, int args_nr, expr_t **args, int line, int col if (fun) { int i; - expr = magic_new_expr(EXPR_FUNAPP); + expr = magic_new_expr(EXPR::FUNAPP); expr->e.e_funapp.line_nr = line; expr->e.e_funapp.column = column; expr->e.e_funapp.id = id; @@ -828,8 +835,8 @@ expr_t *fun_expr(const char *name, int args_nr, expr_t **args, int line, int col for (i = 0; i < args_nr; i++) expr->e.e_funapp.args[i] = args[i]; } else { /* failure */ - expr = magic_new_expr(EXPR_VAL); - expr->e.e_val.ty = TY_FAIL; + expr = magic_new_expr(EXPR::VAL); + expr->e.e_val.ty = TYPE::FAIL; } return expr; @@ -873,7 +880,7 @@ spellguard_t *spellguard_implication(spellguard_t *a, spellguard_t *b) return retval; /* If the premise is a disjunction, b is the continuation of _all_ branches */ - if (a->ty == SPELLGUARD_CHOICE) + if (a->ty == SPELLGUARD::CHOICE) spellguard_implication(a->s.s_alt, b); if (a->next) spellguard_implication(a->next, b); @@ -885,7 +892,7 @@ spellguard_t *spellguard_implication(spellguard_t *a, spellguard_t *b) } static -effect_t *new_effect(EFFECT_ ty) +effect_t *new_effect(EFFECT ty) { effect_t *effect = (effect_t *) calloc(1, sizeof(effect_t)); effect->ty = ty; @@ -903,7 +910,7 @@ effect_t *set_effect_continuation(effect_t *src, effect_t *continuation) /* For FOR and FOREACH, we use special stack handlers and thus don't have to set * the continuation. It's only IF that we need to handle in this fashion. */ - if (src->ty == EFFECT_IF) { + if (src->ty == EFFECT::IF) { set_effect_continuation(src->e.e_if.true_branch, continuation); set_effect_continuation(src->e.e_if.false_branch, continuation); } @@ -932,7 +939,7 @@ effect_t *op_effect(char *name, int args_nr, expr_t **args, int line, int column if (op) { int i; - effect = new_effect(EFFECT_OP); + effect = new_effect(EFFECT::OP); effect->e.e_op.line_nr = line; effect->e.e_op.column = column; effect->e.e_op.id = id; @@ -941,7 +948,7 @@ effect_t *op_effect(char *name, int args_nr, expr_t **args, int line, int column for (i = 0; i < args_nr; i++) effect->e.e_op.args[i] = args[i]; } else /* failure */ - effect = new_effect(EFFECT_SKIP); + effect = new_effect(EFFECT::SKIP); return effect; } @@ -978,15 +985,15 @@ effect_t *call_proc(char *name, int args_nr, expr_t **args, int line_nr, int col if (!p) { fail(line_nr, column, "Unknown procedure `%s'\n", name); - return new_effect(EFFECT_SKIP); + return new_effect(EFFECT::SKIP); } if (p->args_nr != args_nr) { fail(line_nr, column, "Procedure %s/%d invoked with %d parameters\n", name, p->args_nr, args_nr); - return new_effect(EFFECT_SKIP); + return new_effect(EFFECT::SKIP); } - retval = new_effect(EFFECT_CALL); + retval = new_effect(EFFECT::CALL); retval->e.e_call.body = p->body; retval->e.e_call.args_nr = args_nr; retval->e.e_call.formals = p->args; @@ -1036,8 +1043,16 @@ val_t *find_constant(char *name) - -#define INTERN_ASSERT(name, id) { int zid = intern_id(name); if (zid != id) FPRINTF(stderr, "[magic-conf] INTERNAL ERROR: Builtin special var %s interned to %d, not %d as it should be!\n", name, zid, id); error_flag = 1; } +// FIXME: macro capture +#define INTERN_ASSERT(name, id) \ +{ \ + int zid = intern_id(name); \ + if (zid != id) \ + FPRINTF(stderr, \ + "[magic-conf] INTERNAL ERROR: Builtin special var %s interned to %d, not %d as it should be!\n", \ + name, zid, id); \ + error_flag = 1; \ +} extern FILE *magic_frontend_in; @@ -1077,10 +1092,10 @@ int magic_init(const char *conffile) } magic_frontend_parse(); - if (magic_conf.vars[VAR_MIN_CASTTIME].ty == TY_INT) + if (magic_conf.vars[VAR_MIN_CASTTIME].ty == TYPE::INT) magic_conf.min_casttime = magic_conf.vars[VAR_MIN_CASTTIME].v.v_int; - if (magic_conf.vars[VAR_OBSCURE_CHANCE].ty == TY_INT) + if (magic_conf.vars[VAR_OBSCURE_CHANCE].ty == TYPE::INT) magic_conf.obscure_chance = magic_conf.vars[VAR_OBSCURE_CHANCE].v.v_int; PRINTF("[magic-conf] Magic initialised; obscure at %d%%. %d spells, %d teleport anchors.\n", |