diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2021-08-01 12:40:27 -0700 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2021-08-01 12:40:27 -0700 |
| commit | 994c9c973e0fd771699c3a5c76bee11f9b744c84 (patch) | |
| tree | 8257c1abe2d18a50a46a1d712eadbd25fd7e4f8b /definitions.c | |
| parent | cb9b4c40d87480bc794b90c2a36ed0f4c3240d8a (diff) | |
Changed how definitions work
Diffstat (limited to 'definitions.c')
| -rw-r--r-- | definitions.c | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/definitions.c b/definitions.c index c85e227..8216e1d 100644 --- a/definitions.c +++ b/definitions.c @@ -33,26 +33,16 @@ def_t *with_def(def_t *defs, size_t namelen, const char *name, pat_t *pat) // def_t *load_grammar(def_t *defs, file_t *f) { - const char *src = f->start; - src = after_spaces(src); - while (src < f->end) { - const char *name = src; - src = after_name(name); - if (src <= name) - file_err(f, name, src, "Invalid name for definition: %s", name); - size_t namelen = (size_t)(src - name); - if (!matchchar(&src, ':')) - errx(EXIT_FAILURE, "Expected ':' in definition"); - pat_t *pat = bp_pattern(f, src); - if (pat == NULL) break; - defs = with_def(defs, namelen, name, pat); - src = pat->end; - src = after_spaces(src); - if (matchchar(&src, ';')) - src = after_spaces(src); + const char *str = after_spaces(f->start); + while (*str == '\r' || *str == '\n') str = after_spaces(++str); + pat_t *pat = bp_pattern(f, str); + if (!pat) file_err(f, str, f->end, "Could not parse this file"); + if (pat->end < f->end) file_err(f, pat->end, f->end, "Could not parse this part of the file"); + for (pat_t *p = pat; p && p->type == BP_DEFINITION; p = p->args.def.pat) { + // printf("Def '%.*s': %.*s\n", (int)p->args.def.namelen, p->args.def.name, + // (int)(p->args.def.def->end - p->args.def.def->start), p->args.def.def->start); + defs = with_def(defs, p->args.def.namelen, p->args.def.name, p->args.def.def); } - if (src < f->end) - file_err(f, src, NULL, "Invalid BP pattern"); return defs; } |
