aboutsummaryrefslogtreecommitdiff
path: root/compiler.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2020-09-13 20:33:11 -0700
committerBruce Hill <bruce@bruce-hill.com>2020-09-13 20:33:11 -0700
commit1d1c3d35aae0e060a6527d6e83575dd7ff71328e (patch)
treebc9e486906d47fac29d8d0f1e8c8915d2bf5ab9f /compiler.c
parentab5ef5a77af9f2fc7c3353f05bf716b1a6b93f73 (diff)
Added == operator
Diffstat (limited to 'compiler.c')
-rw-r--r--compiler.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/compiler.c b/compiler.c
index 7c5220d..4e2b185 100644
--- a/compiler.c
+++ b/compiler.c
@@ -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;
}