298 |
shorts *sp; |
shorts *sp; |
299 |
|
|
300 |
for (i = 0; i < state->nlookaheads; ++i) |
for (i = 0; i < state->nlookaheads; ++i) |
301 |
if (LArule[state->lookaheadsp + i]->number == ruleno) |
if (state->lookaheads_rule[i]->number == ruleno) |
302 |
break; |
break; |
303 |
|
|
304 |
assert (LArule[state->lookaheadsp + i]->number == ruleno); |
assert (state->lookaheads_rule[i]->number == ruleno); |
305 |
|
|
306 |
sp = XCALLOC (shorts, 1); |
sp = XCALLOC (shorts, 1); |
307 |
sp->next = lookback[state->lookaheadsp + i]; |
sp->next = lookback[(state->lookaheads - LA) + i]; |
308 |
sp->value = gotono; |
sp->value = gotono; |
309 |
lookback[state->lookaheadsp + i] = sp; |
lookback[(state->lookaheads - LA) + i] = sp; |
310 |
} |
} |
311 |
|
|
312 |
|
|
506 |
} |
} |
507 |
|
|
508 |
|
|
509 |
/*--------------------------------------. |
/*-------------------------------------------------------------. |
510 |
| Initializing the lookaheads members. | |
| Count the number of lookaheads required for each state | |
511 |
`--------------------------------------*/ |
| (NLOOKAHEADS member). Compute the total number of LA, NLA. | |
512 |
|
`-------------------------------------------------------------*/ |
513 |
|
|
514 |
static void |
static void |
515 |
initialize_lookaheads (void) |
states_lookaheads_count (void) |
516 |
{ |
{ |
517 |
size_t i; |
size_t i; |
518 |
nLA = 0; |
nLA = 0; |
519 |
|
|
520 |
|
/* Count */ |
521 |
for (i = 0; i < nstates; i++) |
for (i = 0; i < nstates; i++) |
522 |
{ |
{ |
523 |
int k; |
int k; |
543 |
} |
} |
544 |
|
|
545 |
states[i]->nlookaheads = nlookaheads; |
states[i]->nlookaheads = nlookaheads; |
|
states[i]->lookaheadsp = nLA; |
|
546 |
nLA += nlookaheads; |
nLA += nlookaheads; |
547 |
} |
} |
548 |
} |
} |
549 |
|
|
550 |
|
|
551 |
|
/*--------------------------------------. |
552 |
|
| Initializing the lookaheads members. | |
553 |
|
`--------------------------------------*/ |
554 |
|
|
555 |
|
static void |
556 |
|
states_lookaheads_initialize (void) |
557 |
|
{ |
558 |
|
size_t i; |
559 |
|
bitsetv pLA = LA; |
560 |
|
rule_t **pLArule = LArule; |
561 |
|
|
562 |
|
/* Count the number of lookaheads required for each state |
563 |
|
(NLOOKAHEADS member). */ |
564 |
|
for (i = 0; i < nstates; i++) |
565 |
|
{ |
566 |
|
states[i]->lookaheads = pLA; |
567 |
|
states[i]->lookaheads_rule = pLArule; |
568 |
|
pLA += states[i]->nlookaheads; |
569 |
|
pLArule += states[i]->nlookaheads; |
570 |
|
} |
571 |
|
} |
572 |
|
|
573 |
|
|
574 |
/*---------------------------------------. |
/*---------------------------------------. |
575 |
| Output the lookaheads for each state. | |
| Output the lookaheads for each state. | |
576 |
`---------------------------------------*/ |
`---------------------------------------*/ |
588 |
|
|
589 |
for (j = 0; j < states[i]->nlookaheads; ++j) |
for (j = 0; j < states[i]->nlookaheads; ++j) |
590 |
for (k = 0; k < ntokens; ++k) |
for (k = 0; k < ntokens; ++k) |
591 |
if (bitset_test (LA[states[i]->lookaheadsp + j], k)) |
if (bitset_test (states[i]->lookaheads[j], k)) |
592 |
fprintf (out, " on %d (%s) -> rule %d\n", |
fprintf (out, " on %d (%s) -> rule %d\n", |
593 |
k, symbol_tag_get (symbols[k]), |
k, symbol_tag_get (symbols[k]), |
594 |
LArule[states[i]->lookaheadsp + j]->number - 1); |
states[i]->lookaheads_rule[j]->number - 1); |
595 |
} |
} |
596 |
fprintf (out, "Lookaheads: END\n"); |
fprintf (out, "Lookaheads: END\n"); |
597 |
} |
} |
599 |
void |
void |
600 |
lalr (void) |
lalr (void) |
601 |
{ |
{ |
602 |
initialize_lookaheads (); |
states_lookaheads_count (); |
603 |
initialize_LA (); |
initialize_LA (); |
604 |
|
states_lookaheads_initialize (); |
605 |
set_goto_map (); |
set_goto_map (); |
606 |
initialize_F (); |
initialize_F (); |
607 |
build_relations (); |
build_relations (); |