Check that the bparse gen_tab optimization loop finishes when no more improvements occur.

This commit is contained in:
Brian Taylor 2022-11-07 13:47:45 -08:00 committed by Holger Vogt
parent 539176bf15
commit 574737b7b6
1 changed files with 43 additions and 0 deletions

View File

@ -382,6 +382,7 @@ typedef struct parse_table *PTABLE;
struct parse_table {
TLINE first;
TLINE last;
int num_entries;
};
static PTABLE parse_tab = NULL;
@ -392,6 +393,7 @@ static PTABLE new_parse_table(void)
PTABLE pt;
pt = TMALLOC(struct parse_table, 1);
pt->first = pt->last = NULL;
pt->num_entries = 0;
return pt;
}
@ -462,6 +464,7 @@ static TLINE add_to_parse_table(PTABLE pt, char *line, BOOL ignore_blank)
pt->last->next = t;
pt->last = t;
}
pt->num_entries++;
return t;
}
@ -1292,6 +1295,10 @@ static BOOL bparse(char *line, BOOL new_lexer)
lookahead = lex_scan(); // ':'
lookahead = lex_scan();
while (lookahead != '\0') {
#define LOOP_OPT
#ifdef LOOP_OPT
int last_count = 0, curr_count = 0;
#endif
init_parse_tables();
adepth = max_adepth = 0;
stmt_num++;
@ -1303,6 +1310,41 @@ static BOOL bparse(char *line, BOOL new_lexer)
/* generate gates only when optimizations are successful */
opt_tab1 = optimize_gen_tab(gen_tab);
#ifdef LOOP_OPT
last_count = gen_tab->num_entries;
if (opt_tab1) {
int loop_count = 0;
curr_count = opt_tab1->num_entries;
#ifdef TRACE
printf("Start opt last_count %d curr_count %d\n", last_count, curr_count);
#endif
opt_tab2 = opt_tab1;
while (curr_count > 1 && curr_count < last_count) {
loop_count++;
last_count = curr_count;
opt_tab2 = optimize_gen_tab(opt_tab1);
delete_parse_table(opt_tab1);
if (!opt_tab2) {
ret_val = FALSE;
break;
}
opt_tab1 = opt_tab2;
curr_count = opt_tab2->num_entries;
#ifdef TRACE
printf("Next(%d) opt last_count %d curr_count %d\n", loop_count, last_count, curr_count);
#endif
}
#ifdef TRACE
printf("Finish opt last_count %d curr_count %d\n", last_count, curr_count);
#endif
if (opt_tab2) {
gen_gates(opt_tab2, lx->lexer_sym_tab);
delete_parse_table(opt_tab2);
}
} else {
ret_val = FALSE;
}
#else
if (opt_tab1) {
opt_tab2 = optimize_gen_tab(opt_tab1);
if (opt_tab2) {
@ -1313,6 +1355,7 @@ static BOOL bparse(char *line, BOOL new_lexer)
}
delete_parse_table(opt_tab1);
delete_parse_table(opt_tab2);
#endif
delete_parse_gen_tables();
if (!ret_val) {
break;