From: Ben Pfaff Date: Sat, 11 Dec 2021 05:23:07 +0000 (-0800) Subject: everything passes again X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fctables;p=pspp everything passes again --- diff --git a/src/language/command.c b/src/language/command.c index 09c951cae2..bffd13ebb0 100644 --- a/src/language/command.c +++ b/src/language/command.c @@ -375,7 +375,8 @@ report_state_mismatch (const struct command *command, enum cmd_state state) { case CMD_STATE_INITIAL: case CMD_STATE_DATA: - switch ((int) command->states) + switch ((int) command->states + & (S_INITIAL | S_DATA | S_INPUT_PROGRAM | S_FILE_TYPE)) { /* One allowed state. */ case S_INITIAL: diff --git a/src/language/command.def b/src/language/command.def index b588552244..352f7c1078 100644 --- a/src/language/command.def +++ b/src/language/command.def @@ -149,11 +149,17 @@ DEF_CMD (S_DATA, 0, "T-TEST", cmd_t_test) DEF_CMD (S_DATA, 0, "TEMPORARY", cmd_temporary) DEF_CMD (S_DATA, 0, "USE", cmd_use) -/* Commands valid only with INPUT PROGRAM. */ +/* Commands valid only inside INPUT PROGRAM. */ DEF_CMD (S_INPUT_PROGRAM | S_NESTED_INPUT_PROGRAM, 0, "END CASE", cmd_end_case) DEF_CMD (S_INPUT_PROGRAM | S_NESTED_INPUT_PROGRAM, 0, "END FILE", cmd_end_file) DEF_CMD (S_INPUT_PROGRAM | S_NESTED_INPUT_PROGRAM, 0, "REREAD", cmd_reread) +/* Not really commands, but part of LOOP and DO IF syntax. */ +DEF_CMD (S_ANY, 0, "ELSE IF", cmd_inside_do_if) +DEF_CMD (S_ANY, 0, "ELSE", cmd_inside_do_if) +DEF_CMD (S_ANY, 0, "END IF", cmd_inside_do_if) +DEF_CMD (S_ANY, 0, "END LOOP", cmd_inside_loop) + /* Commands for testing PSPP. */ DEF_CMD (S_ANY, F_TESTING, "DEBUG EXPAND", cmd_debug_expand) DEF_CMD (S_ANY, F_TESTING, "DEBUG EVALUATE", cmd_debug_evaluate) diff --git a/src/language/control/do-if.c b/src/language/control/do-if.c index f4fab4734c..c564240bb1 100644 --- a/src/language/control/do-if.c +++ b/src/language/control/do-if.c @@ -143,6 +143,13 @@ cmd_do_if (struct lexer *lexer, struct dataset *ds) return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } +int +cmd_inside_do_if (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) +{ + msg (SE, _("This command cannot appear outside DO IF...END IF.")); + return CMD_FAILURE; +} + static const struct trns_chain * do_if_find_clause (const struct do_if_trns *do_if, struct ccase *c, casenumber case_num) diff --git a/src/language/control/loop.c b/src/language/control/loop.c index 22c73519de..b55028177d 100644 --- a/src/language/control/loop.c +++ b/src/language/control/loop.c @@ -119,6 +119,13 @@ cmd_loop (struct lexer *lexer, struct dataset *ds) return ok ? CMD_SUCCESS : CMD_CASCADING_FAILURE; } +int +cmd_inside_loop (struct lexer *lexer UNUSED, struct dataset *ds UNUSED) +{ + msg (SE, _("This command cannot appear outside LOOP...END LOOP.")); + return CMD_FAILURE; +} + static enum trns_result break_trns_proc (void *aux UNUSED, struct ccase **c UNUSED, casenumber case_num UNUSED) @@ -128,11 +135,11 @@ break_trns_proc (void *aux UNUSED, struct ccase **c UNUSED, /* Parses BREAK. */ int -cmd_break (struct lexer *lexer UNUSED, struct dataset *ds) +cmd_break (struct lexer *lexer, struct dataset *ds) { if (!in_loop) { - msg (SE, _("BREAK cannot appear outside LOOP...END LOOP.")); + cmd_inside_loop (lexer, ds); return CMD_FAILURE; } diff --git a/src/language/data-io/data-list.c b/src/language/data-io/data-list.c index b1a7717340..1ade0dc617 100644 --- a/src/language/data-io/data-list.c +++ b/src/language/data-io/data-list.c @@ -302,6 +302,8 @@ cmd_data_list (struct lexer *lexer, struct dataset *ds) fh_unref (fh); free (encoding); + data_list_seen (); + return CMD_SUCCESS; error: diff --git a/src/language/data-io/inpt-pgm.c b/src/language/data-io/inpt-pgm.c index 03345003b7..c295db6428 100644 --- a/src/language/data-io/inpt-pgm.c +++ b/src/language/data-io/inpt-pgm.c @@ -80,6 +80,12 @@ in_input_program (void) return inside_input_program; } +void +data_list_seen (void) +{ + saw_DATA_LIST = true; +} + /* Emits an END CASE transformation for INP. */ static void emit_END_CASE (struct dataset *ds) diff --git a/src/language/data-io/inpt-pgm.h b/src/language/data-io/inpt-pgm.h index cac4d9b6d7..d6c5bbd63d 100644 --- a/src/language/data-io/inpt-pgm.h +++ b/src/language/data-io/inpt-pgm.h @@ -20,6 +20,7 @@ #include bool in_input_program (void); -void cancel_input_program (void); + +void data_list_seen (void); #endif /* inpt-pgm.h */ diff --git a/src/language/xforms/compute.c b/src/language/xforms/compute.c index 083d7d219f..5c330f65a8 100644 --- a/src/language/xforms/compute.c +++ b/src/language/xforms/compute.c @@ -129,7 +129,6 @@ compute_num (void *compute_, struct ccase **c, casenumber case_num) { struct compute_trns *compute = compute_; - printf ("compute\n"); if (compute->test == NULL || expr_evaluate_num (compute->test, *c, case_num) == 1.0) { diff --git a/tests/language/control/do-if.at b/tests/language/control/do-if.at index d0bf071765..4b862dce4d 100644 --- a/tests/language/control/do-if.at +++ b/tests/language/control/do-if.at @@ -91,8 +91,6 @@ EXECUTE. ]) AT_CHECK([pspp -O format=csv do-if.sps], [1], [dnl do-if.sps:7: error: ELSE: This command cannot appear outside DO IF...END IF. - -do-if.sps:9: error: Stopping syntax file processing here to avoid a cascade of dependent command failures. ]) AT_CLEANUP