aboutsummaryrefslogtreecommitdiff
path: root/grammar.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2020-09-16 22:36:38 -0700
committerBruce Hill <bruce@bruce-hill.com>2020-09-16 22:36:38 -0700
commit82952fa5e955885baa1632b0b0ba2ab040a30f14 (patch)
treeaa02b3dbac36e7a6fb3050f9ae55dbc7e8a637da /grammar.c
parent9ee7102f51c60469659de752f119b1ecbd3c0ba7 (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.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/grammar.c b/grammar.c
index b4621ee..ec0f40a 100644
--- a/grammar.c
+++ b/grammar.c
@@ -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;
}