diff --git a/examples/tests.modal b/examples/tests.modal index cc8a36b..62acf6e 100644 --- a/examples/tests.modal +++ b/examples/tests.modal @@ -8,8 +8,8 @@ ?(?-) (Formatter) -?((?x ?y) one) aaa(bbb) = one (formatter 1) test -?((?x ?y) one) (bbb)aaa = one (formatter 2) test +?((?x ?y) two) aaa(bbb) = two (formatter 1) test +?((?x ?y) two) (bbb)aaa = two (formatter 2) test (a b c ) = (a b c) (formatter 3) test ( a b c) = (a b c) (formatter 4) test ( a b c ) = (a b c) (formatter 5) test diff --git a/src/modal.c b/src/modal.c index 0c1a83f..f0012eb 100644 --- a/src/modal.c +++ b/src/modal.c @@ -2,7 +2,7 @@ typedef struct { unsigned int id, refs, ptr; - char *a, *b, reg[0x10]; + char *a, *b, reg[0x8]; } Rule; static int flip, quiet, cycles = 0x10000; @@ -87,7 +87,7 @@ write_reg(char r, char *reg) } static int -write_rule(Rule *r, char *s, int create) +write_rule(Rule *r, char *s) { while((*dst_++ = *s++)) ; @@ -96,12 +96,7 @@ write_rule(Rule *r, char *s, int create) src_ = bank_b, dst_ = bank_a; else src_ = bank_a, dst_ = bank_b; - if(!quiet) { - if(create) - fprintf(stderr, "<> (%s) (%s)\n", r->a, r->b); - else - fprintf(stderr, "%02d %s\n", r->id, src_), ++r->refs; - } + if(!quiet && r) fprintf(stderr, "%02d %s\n", r->id, src_), ++r->refs; return 1; } @@ -109,7 +104,7 @@ static int apply_rule(Rule *r, char *s) { unsigned int i, id; - char c, *a = r->a, *b = r->b, *origin = dst_, *reg, *regs[0x08]; + char c, *a = r->a, *b = r->b, *origin = dst_, *reg, *regs[0x8]; /* phase: clean registers */ for(i = 0; i < r->ptr; i++) regs[i] = NULL; @@ -145,7 +140,7 @@ apply_rule(Rule *r, char *s) while(*s == ' ') s++; if(*s == ')' && *(dst_ - 1) == ' ') dst_--; } - return write_rule(r, s, 0); + return write_rule(r, s); } static int @@ -194,6 +189,19 @@ compile_rule(Rule *r, int id, char *src) return src; } +static Rule * +find_rule(char *s) +{ + Rule *r = rules; + while(r < rules_) { + char *ss = s, *a = r->a; + while(*ss++ == *a++) + if(!*a) return r; + r++; + } + return NULL; +} + static int rewrite(void) { @@ -202,23 +210,34 @@ rewrite(void) while((c = *s)) { if(c == '(' || spacer(last)) { Rule *r = NULL; - /* phase: rule */ - if(c == '<' && s[1] == '>') { - r = rules_++; - s = compile_rule(r, rules_ - rules - 1, s + 2); - while(*s == ' ') s++; - return write_rule(r, s, 1); - } /* phase: lambda */ if(c == '?' && s[1] == '(') { cap = walk(s + 1), compile_rule(&lambda, -1, s + 2), s = cap; while(*s == ' ') s++; - if(!apply_rule(&lambda, s)) write_rule(&lambda, s, 0); + if(!apply_rule(&lambda, s)) write_rule(&lambda, s); return 1; } + /* phase: define */ + if(c == '<' && s[1] == '>') { + r = rules_++; + s = compile_rule(r, rules_ - rules - 1, s + 2); + if(!quiet && r->a) fprintf(stderr, "<> (%s) (%s)\n", r->a, r->b); + while(*s == ' ') s++; + return write_rule(NULL, s); + } + /* phase: undefine */ + if(c == '>' && s[1] == '<') { + s += 2; + while(*s == ' ') s++; + r = find_rule(s), r->a = 0; + if(!quiet && r->a) fprintf(stderr, ">< (%s)\n", r->a); + s = walk(s); + while(*s == ' ') s++; + return write_rule(NULL, s); + } /* phase: match */ for(r = rules; r < rules_; r++) - if(apply_rule(r, s)) return 1; + if(r->a && apply_rule(r, s)) return 1; } *dst_++ = last = c; s++; @@ -263,6 +282,6 @@ main(int argc, char **argv) if(!cycles--) return !fprintf(stdout, "Modal rewrites exceeded.\n"); while(rules_-- > rules && !quiet) if(!rules_->refs) printf("-- Unused rule: %d <> (%s) (%s)\n", rules_->refs, rules_->a, rules_->b); - if(!quiet) printf(".. %s\n", src_); + if(!quiet) printf(".. [%s]\n", src_); return 0; } \ No newline at end of file