From 13c45645948d16719e748ffeed2bdbf819698ebd Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Fri, 15 Jan 2021 19:35:39 -0800 Subject: Renamed grammar -> definitions --- Makefile | 2 +- bp.c | 2 +- definitions.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ definitions.h | 22 ++++++++++++++ grammar.c | 93 ----------------------------------------------------------- grammar.h | 22 -------------- match.c | 2 +- 7 files changed, 118 insertions(+), 118 deletions(-) create mode 100644 definitions.c create mode 100644 definitions.h delete mode 100644 grammar.c delete mode 100644 grammar.h diff --git a/Makefile b/Makefile index 8be4594..20ee913 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ G= O=-O3 ALL_FLAGS=$(CFLAGS) -DBP_NAME="\"$(NAME)\"" $(EXTRA) $(CWARN) $(G) $(O) -CFILES=pattern.c grammar.c utils.c match.c files.c print.c json.c +CFILES=pattern.c definitions.c utils.c match.c files.c print.c json.c OBJFILES=$(CFILES:.c=.o) all: $(NAME) diff --git a/bp.c b/bp.c index bbc1b36..4a80aef 100644 --- a/bp.c +++ b/bp.c @@ -14,7 +14,7 @@ #include "pattern.h" #include "files.h" -#include "grammar.h" +#include "definitions.h" #include "json.h" #include "print.h" #include "utils.h" diff --git a/definitions.c b/definitions.c new file mode 100644 index 0000000..b2c777d --- /dev/null +++ b/definitions.c @@ -0,0 +1,93 @@ +// +// definitions.c - Code for defining named pattern rules +// + +#include +#include + +#include "pattern.h" +#include "files.h" +#include "definitions.h" +#include "utils.h" + +// +// Return a new list of definitions with one added to the front +// +def_t *with_def(def_t *defs, file_t *f, size_t namelen, const char *name, pat_t *pat) +{ + def_t *def = new(def_t); + def->next = defs; + def->file = f; + def->namelen = namelen; + def->name = name; + def->pat = pat; + return def; +} + +// +// Load the given grammar (semicolon-separated definitions) +// and return the first rule defined. +// +def_t *load_grammar(def_t *defs, file_t *f) +{ + const char *src = f->contents; + src = after_spaces(src); + while (src < f->end) { + const char *name = src; + src = after_name(name); + check(src > name, "Invalid name for definition: %s", name); + size_t namelen = (size_t)(src - name); + check(matchchar(&src, ':'), "Expected ':' in definition"); + pat_t *pat = bp_pattern(f, src); + if (pat == NULL) break; + defs = with_def(defs, f, namelen, name, pat); + src = pat->end; + src = after_spaces(src); + if (matchchar(&src, ';')) + src = after_spaces(src); + } + if (src < f->end) { + fprint_line(stderr, f, src, NULL, "Invalid BP pattern"); + exit(1); + } + return defs; +} + +// +// Look up a backreference or grammar definition by name +// +def_t *lookup(def_t *defs, const char *name) +{ + for ( ; defs; defs = defs->next) { + if (strlen(name) == defs->namelen && strncmp(defs->name, name, defs->namelen) == 0) + return defs; + } + return NULL; +} + +// +// Push a backreference onto the backreference stack +// +def_t *with_backref(def_t *defs, file_t *f, const char *name, match_t *m) +{ + pat_t *backref = new_pat(f, m->start, VM_BACKREF); + backref->end = m->end; + backref->len = -1; // TODO: maybe calculate this? (nontrivial because of replacements) + backref->args.backref = m; + return with_def(defs, f, strlen(name), name, backref); +} + +// +// Free all the given definitions up till (but not including) `stop` +// +void free_defs(def_t **defs, def_t *stop) +{ + while (*defs != stop && *defs != NULL) { + def_t *next = (*defs)->next; + (*defs)->next = NULL; + free(*defs); + (*defs) = next; + } +} + +// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1 diff --git a/definitions.h b/definitions.h new file mode 100644 index 0000000..5a006b4 --- /dev/null +++ b/definitions.h @@ -0,0 +1,22 @@ +// +// definitions.h - Header file defining pattern rules +// +#ifndef DEFINITIONS__H +#define DEFINITIONS__H + +#include "files.h" +#include "types.h" + +__attribute__((nonnull(2,4,5), returns_nonnull)) +def_t *with_def(def_t *defs, file_t *f, size_t namelen, const char *name, pat_t *pat); +__attribute__((nonnull(2,3,4), returns_nonnull)) +def_t *with_backref(def_t *defs, file_t *f, const char *name, match_t *m); +__attribute__((nonnull(2))) +def_t *load_grammar(def_t *defs, file_t *f); +__attribute__((pure, nonnull(2))) +def_t *lookup(def_t *defs, const char *name); +__attribute__((nonnull(1))) +void free_defs(def_t **defs, def_t *stop); + +#endif +// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1 diff --git a/grammar.c b/grammar.c deleted file mode 100644 index e6e2e0a..0000000 --- a/grammar.c +++ /dev/null @@ -1,93 +0,0 @@ -// -// grammar.c - Code for defining grammars (sets of rules) -// - -#include -#include - -#include "pattern.h" -#include "files.h" -#include "grammar.h" -#include "utils.h" - -// -// Return a new list of definitions with one added to the front -// -def_t *with_def(def_t *defs, file_t *f, size_t namelen, const char *name, pat_t *pat) -{ - def_t *def = new(def_t); - def->next = defs; - def->file = f; - def->namelen = namelen; - def->name = name; - def->pat = pat; - return def; -} - -// -// Load the given grammar (semicolon-separated definitions) -// and return the first rule defined. -// -def_t *load_grammar(def_t *defs, file_t *f) -{ - const char *src = f->contents; - src = after_spaces(src); - while (src < f->end) { - const char *name = src; - src = after_name(name); - check(src > name, "Invalid name for definition: %s", name); - size_t namelen = (size_t)(src - name); - check(matchchar(&src, ':'), "Expected ':' in definition"); - pat_t *pat = bp_pattern(f, src); - if (pat == NULL) break; - defs = with_def(defs, f, namelen, name, pat); - src = pat->end; - src = after_spaces(src); - if (matchchar(&src, ';')) - src = after_spaces(src); - } - if (src < f->end) { - fprint_line(stderr, f, src, NULL, "Invalid BP pattern"); - exit(1); - } - return defs; -} - -// -// Look up a backreference or grammar definition by name -// -def_t *lookup(def_t *defs, const char *name) -{ - for ( ; defs; defs = defs->next) { - if (strlen(name) == defs->namelen && strncmp(defs->name, name, defs->namelen) == 0) - return defs; - } - return NULL; -} - -// -// Push a backreference onto the backreference stack -// -def_t *with_backref(def_t *defs, file_t *f, const char *name, match_t *m) -{ - pat_t *backref = new_pat(f, m->start, VM_BACKREF); - backref->end = m->end; - backref->len = -1; // TODO: maybe calculate this? (nontrivial because of replacements) - backref->args.backref = m; - return with_def(defs, f, strlen(name), name, backref); -} - -// -// Free all the given definitions up till (but not including) `stop` -// -void free_defs(def_t **defs, def_t *stop) -{ - while (*defs != stop && *defs != NULL) { - def_t *next = (*defs)->next; - (*defs)->next = NULL; - free(*defs); - (*defs) = next; - } -} - -// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1 diff --git a/grammar.h b/grammar.h deleted file mode 100644 index 397a3c4..0000000 --- a/grammar.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// grammar.h - Header file defining grammars (sets of rule definitions) -// -#ifndef GRAMMAR__H -#define GRAMMAR__H - -#include "files.h" -#include "types.h" - -__attribute__((nonnull(2,4,5), returns_nonnull)) -def_t *with_def(def_t *defs, file_t *f, size_t namelen, const char *name, pat_t *pat); -__attribute__((nonnull(2,3,4), returns_nonnull)) -def_t *with_backref(def_t *defs, file_t *f, const char *name, match_t *m); -__attribute__((nonnull(2))) -def_t *load_grammar(def_t *defs, file_t *f); -__attribute__((pure, nonnull(2))) -def_t *lookup(def_t *defs, const char *name); -__attribute__((nonnull(1))) -void free_defs(def_t **defs, def_t *stop); - -#endif -// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1 diff --git a/match.c b/match.c index a9e32bc..286c077 100644 --- a/match.c +++ b/match.c @@ -7,7 +7,7 @@ #include #include -#include "grammar.h" +#include "definitions.h" #include "types.h" #include "utils.h" #include "match.h" -- cgit v1.2.3