commit - c8b1a82f1fd6a4ae0122d031cd5db7d0ff7dcee1
commit + 433a5f454f2c22d5c78edda09ff911bd778640ff
blob - 6d6cf89cfcdfa24ae10076757a596f16cb59a029
blob + 04799503c1900e853577c30ac417803b7d9b3b05
--- nfa.c
+++ nfa.c
*/
#include "nfa.h"
+#include <stdio.h>
+#include <ctype.h>
#include <assert.h>
}
+/* 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("<inner %d>", 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)
for (I = 0; I < (A).size; I++) if (inset(SET, I))
/* diagnostic output: print input symbol and state set */
-#include <stdio.h>
static void
printstates(const struct set *set, int x)
{
blob - 32fe3ed0306698b10a5c55d7fc0a7f170c32983d
blob + 85ba26fc94f7829119ff875aa8325b4204a629cd
--- nfa.h
+++ nfa.h
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
*/
#include "nfa.h"
-#include <assert.h>
+#include <stdio.h>
#include <string.h>
+#include <assert.h>
-#include <stdio.h>
-#include <ctype.h>
-
-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("<inner %d>", 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 {
}
}
- print_nfa(nfa);
+ nfaprint(nfa);
putchar('\n');
for (int i = 1; i < argc; i++) {
char *inp;