More robust walking
This commit is contained in:
parent
d0acff37be
commit
f51040de77
|
@ -1,4 +1,5 @@
|
||||||
<> (?x dup) (?x ?x)
|
<> (dup ?x) (?x ?x)
|
||||||
<> (?x ?y swap) (?y ?x)
|
<> (?x ?y swap) (?y ?x)
|
||||||
|
|
||||||
(1234 dup)
|
((hey) (there) swap)
|
||||||
|
|
||||||
|
|
15
src/modal.c
15
src/modal.c
|
@ -19,11 +19,11 @@ walk(char *s)
|
||||||
int depth = 0;
|
int depth = 0;
|
||||||
char c;
|
char c;
|
||||||
while((c = *s++)) {
|
while((c = *s++)) {
|
||||||
if(spacer(c) && !depth) break;
|
|
||||||
if(c == '(') depth++;
|
if(c == '(') depth++;
|
||||||
if(c == ')') --depth;
|
if(c == ')') --depth;
|
||||||
|
if(spacer(c) && !depth) break;
|
||||||
}
|
}
|
||||||
return s - 1;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
|
@ -31,7 +31,9 @@ match(char *p, Rule *r)
|
||||||
{
|
{
|
||||||
char c, *a = r->a, *b = p;
|
char c, *a = r->a, *b = p;
|
||||||
while((c = *a)) {
|
while((c = *a)) {
|
||||||
if(c == '?') regs[(int)*(++a)] = b, a++, b = walk(b), c = *b;
|
if(c == '?') {
|
||||||
|
regs[(int)*(++a)] = b, a++, b = walk(b), c = *b;
|
||||||
|
}
|
||||||
if(c != *b) return NULL;
|
if(c != *b) return NULL;
|
||||||
a++, b++;
|
a++, b++;
|
||||||
}
|
}
|
||||||
|
@ -44,10 +46,10 @@ writereg(char r)
|
||||||
int depth = 0;
|
int depth = 0;
|
||||||
char c, *s = regs[(int)r];
|
char c, *s = regs[(int)r];
|
||||||
while((c = *s++)) {
|
while((c = *s++)) {
|
||||||
if(spacer(c) && !depth) break;
|
*outp_++ = c;
|
||||||
if(c == '(') depth++;
|
if(c == '(') depth++;
|
||||||
if(c == ')') --depth;
|
if(c == ')') --depth;
|
||||||
*outp_++ = c;
|
if(!depth) break;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -74,11 +76,12 @@ rewrite(void)
|
||||||
char *res = match(p, r);
|
char *res = match(p, r);
|
||||||
if(res != NULL) {
|
if(res != NULL) {
|
||||||
char cc, *b = r->b;
|
char cc, *b = r->b;
|
||||||
while((cc = *b++))
|
while((cc = *b++)) {
|
||||||
if(cc == '?')
|
if(cc == '?')
|
||||||
writereg(*b++);
|
writereg(*b++);
|
||||||
else
|
else
|
||||||
*outp_++ = cc;
|
*outp_++ = cc;
|
||||||
|
}
|
||||||
found = success = 1;
|
found = success = 1;
|
||||||
p = res;
|
p = res;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue