diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2020-09-16 22:36:38 -0700 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2020-09-16 22:36:38 -0700 |
| commit | 82952fa5e955885baa1632b0b0ba2ab040a30f14 (patch) | |
| tree | aa02b3dbac36e7a6fb3050f9ae55dbc7e8a637da /grammar.c | |
| parent | 9ee7102f51c60469659de752f119b1ecbd3c0ba7 (diff) | |
Removed the requirement for semicolons, changed '=' -> ':' for
definitions, added better error reporting for failed BPEG grammars
Diffstat (limited to 'grammar.c')
| -rw-r--r-- | grammar.c | 20 |
1 files changed, 14 insertions, 6 deletions
@@ -33,25 +33,33 @@ void add_def(grammar_t *g, file_t *f, const char *src, const char *name, vm_op_t */ vm_op_t *load_grammar(grammar_t *g, file_t *f) { + check(f, "Null file provided"); vm_op_t *ret = NULL; const char *src = f->contents; - do { - src = after_spaces(src); - if (!*src) break; + src = after_spaces(src); + while (*src) { const char *name = src; const char *name_end = after_name(name); check(name_end > name, "Invalid name for definition"); name = strndup(name, (size_t)(name_end-name)); src = after_spaces(name_end); - check(matchchar(&src, '='), "Expected '=' in definition"); + check(matchchar(&src, ':'), "Expected ':' in definition"); vm_op_t *op = bpeg_pattern(f, src); - check(op, "Couldn't load definition"); + if (op == NULL) break; + //check(op, "Couldn't load definition"); add_def(g, f, src, name, op); if (ret == NULL) { ret = op; } src = op->end; - } while (*src && matchchar(&src, ';')); + src = after_spaces(src); + if (*src && matchchar(&src, ';')) + src = after_spaces(src); + } + if (src < &f->contents[f->length-1]) { + fprint_line(stderr, f, src, NULL, "Invalid BPEG pattern"); + _exit(1); + } return ret; } |
