X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/5e893e1c884b0d39965d6b694821a36648f1eda1..56c47203421107ee019a20f3b56cfb967ad75bd2:/src/state.c?ds=sidebyside diff --git a/src/state.c b/src/state.c index 7c3b6921..cb4cd5bc 100644 --- a/src/state.c +++ b/src/state.c @@ -1,5 +1,5 @@ /* Type definitions for nondeterministic finite state machine for bison, - Copyright 2001 Free Software Foundation, Inc. + Copyright (C) 2001, 2002 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -20,12 +20,17 @@ #include "system.h" +#include "gram.h" #include "state.h" /*---------------------------------. | Create a new array of N shitfs. | `---------------------------------*/ +#define SHIFTS_ALLOC(Nshifts) \ + (shifts *) xcalloc ((unsigned) (sizeof (shifts) \ + + (Nshifts - 1) * sizeof (short)), 1) + shifts * shifts_new (int n) { @@ -33,3 +38,79 @@ shifts_new (int n) res->nshifts = n; return res; } + + +/*-------------------------------. +| Create a new array of N errs. | +`-------------------------------*/ + +#define ERRS_ALLOC(Nerrs) \ + (errs *) xcalloc ((unsigned) (sizeof (errs) \ + + (Nerrs - 1) * sizeof (short)), 1) + + +errs * +errs_new (int n) +{ + errs *res = ERRS_ALLOC (n); + res->nerrs = n; + return res; +} + + +errs * +errs_dup (errs *src) +{ + errs *res = errs_new (src->nerrs); + memcpy (res->errs, src->errs, src->nerrs * sizeof (src->errs[0])); + return res; +} + +/*-------------------------------------. +| Create a new array of N reductions. | +`-------------------------------------*/ + +#define REDUCTIONS_ALLOC(Nreductions) \ + (reductions *) xcalloc ((unsigned) (sizeof (reductions) \ + + (Nreductions - 1) * sizeof (short)), 1) + +reductions * +reductions_new (int n) +{ + reductions *res = REDUCTIONS_ALLOC (n); + res->nreds = n; + return res; +} + + +/*--------------------------------------------------------------. +| Print on OUT all the lookaheads such that this STATE wants to | +| reduce this RULE. | +`--------------------------------------------------------------*/ + +void +state_rule_lookaheads_print (state_t *state, rule_t *rule, FILE *out) +{ + int j, k; + int nlookaheads = 0; + /* Count the number of lookaheads corresponding to this rule. */ + for (j = 0; j < state->nlookaheads; ++j) + for (k = 0; k < ntokens; ++k) + if (bitset_test (state->lookaheads[j], k) + && state->lookaheads_rule[j]->number == rule->number) + nlookaheads++; + + /* Print them if there are. */ + if (nlookaheads) + { + fprintf (out, " ["); + for (j = 0; j < state->nlookaheads; ++j) + for (k = 0; k < ntokens; ++k) + if (bitset_test (state->lookaheads[j], k) + && state->lookaheads_rule[j]->number == rule->number) + fprintf (out, "%s%s", + symbol_tag_get (symbols[k]), + --nlookaheads ? ", " : ""); + fprintf (out, "]"); + } +}