diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2020-09-13 20:33:11 -0700 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2020-09-13 20:33:11 -0700 |
| commit | 1d1c3d35aae0e060a6527d6e83575dd7ff71328e (patch) | |
| tree | bc9e486906d47fac29d8d0f1e8c8915d2bf5ab9f /compiler.c | |
| parent | ab5ef5a77af9f2fc7c3353f05bf716b1a6b93f73 (diff) | |
Added == operator
Diffstat (limited to 'compiler.c')
| -rw-r--r-- | compiler.c | 26 |
1 files changed, 24 insertions, 2 deletions
@@ -372,8 +372,7 @@ vm_op_t *bpeg_simplepattern(const char *str) const char *refname = str; str = after_name(str); op->op = VM_REF; - op->len = (ssize_t)(str - refname); - op->args.s = strndup(refname, (size_t)op->len); + op->args.s = strndup(refname, (size_t)(str - refname)); break; } else { free(op); @@ -382,6 +381,29 @@ vm_op_t *bpeg_simplepattern(const char *str) } } op->end = str; + + // Postfix operators: + postfix: + str = after_spaces(str); + if (strncmp(str, "==", 2) == 0) { + str += 2; + vm_op_t *first = op; + vm_op_t *second = bpeg_simplepattern(str); + check(second, "Expected pattern after '=='"); + check(first->len == -1 || second->len == -1 || first->len == second->len, + "Two patterns cannot possibly match the same (different lengths: %ld != %ld)", + first->len, second->len); + op = calloc(sizeof(vm_op_t), 1); + op->op = VM_EQUAL; + op->start = str; + op->end = second->end; + op->len = (first->len == -1 || second->len == -1) ? -1 : first->len; + op->args.multiple.first = first; + op->args.multiple.second = second; + str = op->end; + goto postfix; + } + return op; } |
