diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2020-09-28 16:14:06 -0700 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2020-09-28 16:14:06 -0700 |
| commit | 5049bd7cad8478ecb3f16f8aa7b9b741825922d7 (patch) | |
| tree | c07da0b9c290abd439228329f070f581f76a9272 /compiler.c | |
| parent | 88571d7639d1bfa134b9b4f89ddd031b11fe8f69 (diff) | |
New grammar: [<pat>] instead of 0-1(<pat>), and @foo=<pat> instead of
@[foo]<pat>
Diffstat (limited to 'compiler.c')
| -rw-r--r-- | compiler.c | 22 |
1 files changed, 15 insertions, 7 deletions
@@ -252,16 +252,24 @@ vm_op_t *bpeg_simplepattern(file_t *f, const char *str) check(matchchar(&str, ')'), "Expected closing ')' instead of \"%s\"", str); break; } + // Square brackets + case '[': { + vm_op_t *pat = bpeg_simplepattern(f, str); + check(pat, "Expected pattern inside square brackets"); + pat = expand_choices(f, pat); + str = pat->end; + str = after_spaces(str); + check(matchchar(&str, ']'), "Expected closing ']' instead of \"%s\"", str); + set_range(op, 0, 1, pat, NULL); + break; + } // Capture case '@': { op->op = VM_CAPTURE; - str = after_spaces(str); - if (matchchar(&str, '[')) { - char *closing = strchr(str, ']'); - check(closing, "Expected closing ']'"); - op->args.capture.name = strndup(str, (size_t)(closing-str)); - str = closing; - check(matchchar(&str, ']'), "Expected closing ']'"); + const char *a = *str == '!' ? &str[1] : after_name(str); + if (a > str && *after_spaces(a) == '=') { + op->args.capture.name = strndup(str, (size_t)(a-str)); + str = a + 1; } vm_op_t *pat = bpeg_simplepattern(f, str); check(pat, "Expected pattern after @"); |
