commit 433a5f454f2c22d5c78edda09ff911bd778640ff from: Sven M. Hallberg date: Wed Mar 23 19:43:18 2022 UTC move print_nfa() to nfa.c as nfaprint() commit - c8b1a82f1fd6a4ae0122d031cd5db7d0ff7dcee1 commit + 433a5f454f2c22d5c78edda09ff911bd778640ff blob - 6d6cf89cfcdfa24ae10076757a596f16cb59a029 blob + 04799503c1900e853577c30ac417803b7d9b3b05 --- nfa.c +++ nfa.c @@ -3,6 +3,8 @@ */ #include "nfa.h" +#include +#include #include @@ -341,6 +343,74 @@ star(NFA a) } +/* diagnostic output: print an NFA as a sequence of states */ +void +nfaprint(NFA a) +{ + struct state s; + int i; + + for(i = 0; i < a.size; i++) { + s = a.state[i]; + +#if 0 + /* a simple uniform display format for the raw state data */ + printf("%5d: [%2Xh, %2Xh) -> %d, e -> %d\n", i, + (unsigned)s.chr.base, (unsigned)s.chr.base + s.chr.n, + i + s.edge_chr, i + s.edge_eps); +#else + /* + * a big mess of conditionals to make the possible cases easy + * to read and distinguish for hunams + */ + printf("%5d: ", i); + if (s.chr.n == 0) { + /* edge_chr is an epsilon or inner input edge */ + if (s.chr.base != 0) + printf("", s.chr.base - INNER); + else if (s.edge_chr != 1) + printf("e"); /* epsilon */ + if (s.edge_chr != 1) + printf(" -> %d", i + s.edge_chr); + } else { + if (s.chr.n < 0) /* negative range */ + printf(")%2Xh, %2Xh(", + (unsigned)s.chr.base + s.chr.n, + (unsigned)s.chr.base - 1); + else if (s.chr.n == 1) { /* singleton */ + if (s.chr.base >= OUTPUT) { + printf(">output %d<", + s.chr.base - OUTPUT); + } else { + printf("%2Xh", (unsigned)s.chr.base); + if (isprint(s.chr.base)) + printf(" '%c'", s.chr.base); + else if (s.chr.base == END) + printf(" END"); + } + } else + printf("[%2Xh, %2Xh]", (unsigned)s.chr.base, + (unsigned)s.chr.base + s.chr.n - 1); + if (s.edge_chr != 1) + printf(" -> %d", i + s.edge_chr); + } + if (s.edge_eps != 0) { + if (s.chr.n != 0 || s.edge_chr != 1) + printf(", "); + printf("e -> %d", i + s.edge_eps); + } else if (s.chr.n != 0) { /* no epsilon edges */ + if (s.edge_chr == 0) /* no future */ + printf(" (fail!)"); + } + putchar('\n'); +#endif + } + + /* show the virtual final state for completeness */ + printf("%5d: (final)\n", i); +} + + #ifdef BITSET typedef unsigned long bunch_t; /* a bunch of bits */ #define BUNCH_BIT (sizeof(bunch_t) * CHAR_BIT) @@ -391,7 +461,6 @@ setremove(struct set *set, int x) for (I = 0; I < (A).size; I++) if (inset(SET, I)) /* diagnostic output: print input symbol and state set */ -#include static void printstates(const struct set *set, int x) { blob - 32fe3ed0306698b10a5c55d7fc0a7f170c32983d blob + 85ba26fc94f7829119ff875aa8325b4204a629cd --- nfa.h +++ nfa.h @@ -74,3 +74,7 @@ int nfacont(struct prep *, const char *, size_t); int nfaend(struct prep *); int nfamatch(NFA, sub_t *, out_t *, void *, const char *, size_t); + + +/* diagnostics */ +void nfaprint(NFA); blob - 5a9bec5e272c9ba8094181042bf6d785a5e6da23 blob + 46680b86e2e990fd02f90848980f04ee43c9a317 --- test_nfa.c +++ test_nfa.c @@ -3,80 +3,11 @@ */ #include "nfa.h" -#include +#include #include +#include -#include -#include - -void -print_nfa(NFA a) -{ - struct state s; - int i; - - for(i = 0; i < a.size; i++) { - s = a.state[i]; - -#if 0 - /* a simple uniform display format for the raw state data */ - printf("%5d: [%2Xh, %2Xh) -> %d, e -> %d\n", i, - (unsigned)s.chr.base, (unsigned)s.chr.base + s.chr.n, - i + s.edge_chr, i + s.edge_eps); -#else - /* - * a big mess of conditionals to make the possible cases easy - * to read and distinguish for hunams - */ - printf("%5d: ", i); - if (s.chr.n == 0) { - /* edge_chr is an epsilon or inner input edge */ - if (s.chr.base != 0) - printf("", s.chr.base - INNER); - else if (s.edge_chr != 1) - printf("e"); /* epsilon */ - if (s.edge_chr != 1) - printf(" -> %d", i + s.edge_chr); - } else { - if (s.chr.n < 0) /* negative range */ - printf(")%2Xh, %2Xh(", - (unsigned)s.chr.base + s.chr.n, - (unsigned)s.chr.base - 1); - else if (s.chr.n == 1) { /* singleton */ - if (s.chr.base >= OUTPUT) { - printf(">output %d<", - s.chr.base - OUTPUT); - } else { - printf("%2Xh", (unsigned)s.chr.base); - if (isprint(s.chr.base)) - printf(" '%c'", s.chr.base); - else if (s.chr.base == END) - printf(" END"); - } - } else - printf("[%2Xh, %2Xh]", (unsigned)s.chr.base, - (unsigned)s.chr.base + s.chr.n - 1); - if (s.edge_chr != 1) - printf(" -> %d", i + s.edge_chr); - } - if (s.edge_eps != 0) { - if (s.chr.n != 0 || s.edge_chr != 1) - printf(", "); - printf("e -> %d", i + s.edge_eps); - } else if (s.chr.n != 0) { /* no epsilon edges */ - if (s.edge_chr == 0) /* no future */ - printf(" (fail!)"); - } - putchar('\n'); -#endif - } - - /* show the virtual final state for completeness */ - printf("%5d: (final)\n", i); -} - - /* the parser's mind */ enum gedanken { @@ -259,7 +190,7 @@ main(int argc, char **argv) } } - print_nfa(nfa); + nfaprint(nfa); putchar('\n'); for (int i = 1; i < argc; i++) { char *inp;