From 5e6452099e4ad8163e1a772e4af4656b81c2a9b3 Mon Sep 17 00:00:00 2001 From: Brian Taylor Date: Mon, 26 Dec 2022 21:47:38 -0800 Subject: [PATCH] Return errors from f_logicexp and f_pindly without calling exit. --- src/frontend/logicexp.c | 118 ++++++++++++++++++++++++++++------------ src/frontend/udevices.c | 13 ++++- 2 files changed, 94 insertions(+), 37 deletions(-) diff --git a/src/frontend/logicexp.c b/src/frontend/logicexp.c index 7acc9bd08..479dbceb9 100644 --- a/src/frontend/logicexp.c +++ b/src/frontend/logicexp.c @@ -606,9 +606,9 @@ static void ptable_print(PTABLE pt) static char *get_inst_name(void); static char *get_inverter_output_name(char *input); static void aerror(char *s); -static void amatch(int t); -static void bexpr(void); -static void bfactor(void); +static BOOL amatch(int t); +static BOOL bexpr(void); +static BOOL bfactor(void); static BOOL bparse(char *line, BOOL new_lexer); static int lookahead = 0; @@ -618,6 +618,13 @@ static DSTRING d_curr_line; static int number_of_instances = 0; static BOOL use_tmodel_delays = FALSE; +static void cleanup_parser(void) +{ + delete_lexer(parse_lexer); + parse_lexer = NULL; + delete_parse_gen_tables(); +} + static char *get_inst_name(void) { static char name[64]; @@ -714,7 +721,7 @@ static void aerror(char *s) { LEXER lx = parse_lexer; printf("%s [%s]\n", s, lx->lexer_line + lx->lexer_pos); - exit(1); + cleanup_parser(); } char *get_temp_name(void) @@ -726,19 +733,28 @@ char *get_temp_name(void) return name; } -static void amatch(int t) +static BOOL amatch(int t) { LEXER lx = parse_lexer; if (lookahead == t) { lookahead = lex_scan(); } else { - printf("t = '%c' [%d] lookahead = '%c' [%d] lexer_buf %s\n", + printf("expect = '%c' [%d] lookahead = '%c' [%d] lexer_buf %s\n", t, t, lookahead, lookahead, lx->lexer_buf); aerror("amatch: syntax error"); + return FALSE; } + return TRUE; } -static void bfactor(void) +#define AMATCH_BFACTOR(n) \ +{ \ + if (!amatch((n))) { \ + return FALSE; \ + } \ +} + +static BOOL bfactor(void) { /* factor is : ['~'] rest where rest is: input_name_id | '(' expr ')' | error @@ -789,7 +805,10 @@ static void bfactor(void) ds_clear(&d_curr_line); lookahead = lex_scan(); - bexpr(); + if (!bexpr()) { + cleanup_parser(); + return FALSE; + } (void) ptab_add_line(ds_get_buf(&d_curr_line), TRUE); ds_clear(&d_curr_line); @@ -799,44 +818,62 @@ static void bfactor(void) (void) ptab_add_line(ds_get_buf(&d_curr_line), TRUE); ds_clear(&d_curr_line); - amatch(')'); ds_free(&tmpnam); + AMATCH_BFACTOR(')'); } else { aerror("bfactor: syntax error"); + return FALSE; } adepth--; + return TRUE; } -static void bexpr(void) +static BOOL bexpr(void) { /* expr is: factor { gate_op factor }+ where {}+ means 0 or more times. */ - bfactor(); + if (!bfactor()) { + cleanup_parser(); + return FALSE; + } while (lex_gate_op(lookahead)) { ds_cat_printf(&d_curr_line, "%c ", lookahead); lookahead = lex_scan(); - bfactor(); + if (!bfactor()) { + cleanup_parser(); + return FALSE; + } } + return TRUE; } -static void bstmt(void) +#define AMATCH_BSTMT(n) \ +{ \ + if (!amatch((n))) { \ + ds_free(&tname); ds_free(&assign); \ + return FALSE; \ + } \ +} + +static BOOL bstmt(void) { /* A stmt is: output_name_id = '{' expr '}' */ BOOL verbose = PRINT_ALL; int end_pos = 0, start_pos = 0; SYM_TAB entry = NULL; - LEXER lx = parse_lexer; DS_CREATE(tname, 64); DS_CREATE(assign, LEX_BUF_SZ); if (lookahead == LEX_ID) { - entry = add_sym_tab_entry(lx->lexer_buf, SYM_ID, &lx->lexer_sym_tab); + entry = add_sym_tab_entry(parse_lexer->lexer_buf, SYM_ID, + &parse_lexer->lexer_sym_tab); } else { aerror("bstmt: syntax error"); + return FALSE; } adepth++; @@ -844,18 +881,18 @@ static void bstmt(void) max_adepth = adepth; if (verbose) { - start_pos = lx->lexer_pos; - printf("* %s", lx->lexer_buf); + start_pos = parse_lexer->lexer_pos; + printf("* %s", parse_lexer->lexer_buf); } - amatch(LEX_ID); - amatch('='); + AMATCH_BSTMT(LEX_ID); + AMATCH_BSTMT('='); ds_clear(&assign); ds_cat_printf(&assign, "%s =", entry->name); (void) ptab_add_line(ds_get_buf(&assign), TRUE); - amatch('{'); + AMATCH_BSTMT('{'); ds_clear(&tname); ds_cat_str(&tname, get_temp_name()); @@ -863,7 +900,12 @@ static void bstmt(void) (void) ptab_add_line(ds_get_buf(&d_curr_line), TRUE); ds_clear(&d_curr_line); - bexpr(); + if (!bexpr()) { + cleanup_parser(); + ds_free(&assign); + ds_free(&tname); + return FALSE; + } if (ds_get_length(&d_curr_line) > 0) { (void) ptab_add_line(ds_get_buf(&d_curr_line), TRUE); @@ -875,19 +917,19 @@ static void bstmt(void) if (verbose) { DS_CREATE(stmt_str, 128); - end_pos = lx->lexer_pos; - ds_cat_mem(&stmt_str, &lx->lexer_line[start_pos], + end_pos = parse_lexer->lexer_pos; + ds_cat_mem(&stmt_str, &parse_lexer->lexer_line[start_pos], (size_t) (end_pos - start_pos)); printf("%s\n", ds_get_buf(&stmt_str)); ds_free(&stmt_str); } - amatch('}'); + AMATCH_BSTMT('}'); ds_free(&assign); ds_free(&tname); adepth--; - return; + return TRUE; } static PTABLE optimize_gen_tab(PTABLE pt) @@ -1374,7 +1416,6 @@ static BOOL bparse(char *line, BOOL new_lexer) { int stmt_num = 0; BOOL ret_val = TRUE, prit = PRINT_ALL; - LEXER lx; PTABLE opt_tab1 = NULL, opt_tab2 = NULL; DS_CREATE(stmt, LEX_BUF_SZ); char *seed_buf; @@ -1389,7 +1430,6 @@ static BOOL bparse(char *line, BOOL new_lexer) if (new_lexer) lex_init(line); if (!parse_lexer) return FALSE; - lx = parse_lexer; lookahead = lex_set_start("logic:"); lookahead = lex_scan(); // "logic" lookahead = lex_scan(); // ':' @@ -1400,8 +1440,12 @@ static BOOL bparse(char *line, BOOL new_lexer) adepth = max_adepth = 0; stmt_num++; ds_clear(&stmt); - ds_cat_str(&stmt, lx->lexer_buf); - bstmt(); + ds_cat_str(&stmt, parse_lexer->lexer_buf); + if (!bstmt()) { + cleanup_parser(); + ret_val= FALSE; + break; + } if (prit) { printf("START parse_tab\n"); @@ -1418,7 +1462,7 @@ static BOOL bparse(char *line, BOOL new_lexer) } last_count = gen_tab->entry_count; if (last_count == 1) { - ret_val = gen_gates(gen_tab, lx->lexer_sym_tab); + ret_val = gen_gates(gen_tab, parse_lexer->lexer_sym_tab); if (!ret_val) { printf("ERROR generating gates for logicexp\n"); } @@ -1447,9 +1491,10 @@ static BOOL bparse(char *line, BOOL new_lexer) curr_count = opt_tab2->entry_count; } if (opt_tab2) { - ret_val = gen_gates(opt_tab2, lx->lexer_sym_tab); + ret_val = gen_gates(opt_tab2, parse_lexer->lexer_sym_tab); if (!ret_val) { - printf("ERROR generating gates for logicexp\n"); + printf( + "ERROR generating gates for logicexp\n"); } delete_parse_table(opt_tab2); } @@ -1466,9 +1511,10 @@ static BOOL bparse(char *line, BOOL new_lexer) } // end while lookahead loop ds_free(&d_curr_line); - gen_models(); + if (ret_val) + gen_models(); ds_free(&stmt); - delete_lexer(lx); + cleanup_parser(); return ret_val; } /* End of logicexp parser */ @@ -1487,7 +1533,8 @@ static BOOL expect_token( { if (tok != expected_tok) { if (msg) { - printf("ERROR expect_token failed tok %d expected_tok %d loc %d\n", + printf( + "ERROR expect_token failed tok %d expected_tok %d loc %d\n", tok, expected_tok, loc); } return FALSE; @@ -1595,6 +1642,7 @@ BOOL f_logicexp(char *line) if (!ret_val) { printf("ERROR parsing logicexp\n"); printf("ERROR in \"%s\"\n", line); + cleanup_parser(); } return ret_val; diff --git a/src/frontend/udevices.c b/src/frontend/udevices.c index 6d9992df7..cc570c245 100644 --- a/src/frontend/udevices.c +++ b/src/frontend/udevices.c @@ -3612,16 +3612,25 @@ BOOL u_process_instance(char *nline) char *p1, *itype, *xspice; struct instance_hdr *hdr = create_instance_header(nline); Xlatorp xp = NULL; + BOOL behav_ret = TRUE; itype = hdr->instance_type; xspice = find_xspice_for_delay(itype); if (!xspice) { if (eq(itype, "logicexp")) { delete_instance_hdr(hdr); - return f_logicexp(nline); + behav_ret = f_logicexp(nline); + if (!behav_ret && current_subckt && ps_udevice_msgs >= 1) { + printf("ERROR in %s\n", current_subckt); + } + return behav_ret; } else if (eq(itype, "pindly")) { delete_instance_hdr(hdr); - return f_pindly(nline); + behav_ret = f_pindly(nline); + if (!behav_ret && current_subckt && ps_udevice_msgs >= 1) { + printf("ERROR in %s\n", current_subckt); + } + return behav_ret; } else if (eq(itype, "constraint")) { delete_instance_hdr(hdr); return TRUE;