// Parse the effects of a rule (after :) bool parse_rule_effects(golem_tokenizer *tokenizer, golem_rule *rule) { log("> parse effects [%d]\n", tokenizer->token); get_token(tokenizer); golem_effect *effect = NULL, *last = NULL; for (;;) { effect = parse_effect(tokenizer); log("= got an effect (%d)\n", effect->type); if (last) { last->next = effect; log("+ adding effect after last (%d -> %d)\n", last->type, effect->type); } else { rule->effects = effect; } last = effect; log("- got an effect (%d), next [%d]\n", effect->type, tokenizer->token); if (tokenizer->token == '.') { log("< parsed effects [%d]\n", tokenizer->token); return false; } if (tokenizer->token != ',') { if (effect->type == effect_string) { log("< parsed effects; last: %d [%d]\n", effect->type, tokenizer->token); return true; } die("parse effects: expected string or ."); } (void)get_token(tokenizer); } }
static test_patch_t* parse_patch (scanner_t *scanner) { test_patch_t *patch; patch = g_new0 (test_patch_t, 1); patch->selector = parse_selector (scanner); patch->effect = parse_effect (scanner); return patch; }
Parse_stat MCAnswer::parse(MCScriptPoint &sp) { Parse_errors t_error = PE_UNDEFINED; Symbol_type t_type; const LT *t_literal; initpoint(sp); getit(sp, it); if (sp . skip_token(SP_ASK, TT_UNDEFINED, AT_PAGE) == PS_NORMAL) { if (sp . skip_token(SP_ASK, TT_UNDEFINED, AT_SETUP) == PS_NORMAL) mode = AT_PAGESETUP; else t_error = PE_ANSWER_BADQUESTION; } else if (sp . next(t_type) == PS_NORMAL) { if (sp . lookup(SP_ASK, t_literal) == PS_NORMAL) mode = (Ask_type)t_literal -> which; else sp . backup(); } if (t_error == PE_UNDEFINED) switch(mode) { case AT_PAGESETUP: // MJ: adding support for "answer pagesetup" syntax, following existing code t_error = parse_pagesetup(sp); break; case AT_PRINTER: t_error = parse_printer(sp); break; case AT_EFFECT: t_error = parse_effect(sp); break; case AT_RECORD: t_error = parse_record(sp); break; case AT_COLOR: t_error = parse_colour(sp); break; case AT_FILE: case AT_FILES: t_error = parse_file(sp); break; case AT_FOLDER: case AT_FOLDERS: t_error = parse_folder(sp); break; default: t_error = parse_notify(sp); break; } if (t_error == PE_UNDEFINED && sp . skip_token(SP_ASK, TT_UNDEFINED, AT_TITLED) == PS_NORMAL) if (sp . parseexp(False, True, &title) != PS_NORMAL) t_error = PE_ANSWER_BADTITLE; if (t_error == PE_UNDEFINED && sp . skip_token(SP_FACTOR, TT_PREP, PT_AS) == PS_NORMAL) if (sp . skip_token(SP_ASK, TT_UNDEFINED, AT_SHEET) == PS_NORMAL) sheet = True; else t_error = PE_ANSWER_BADRESPONSE; if (t_error != PE_UNDEFINED) { MCperror -> add(t_error, sp); return PS_ERROR; } return PS_NORMAL; }