diff --git a/src/modal.c b/src/modal.c index c3e1388..5ef7d54 100644 --- a/src/modal.c +++ b/src/modal.c @@ -122,30 +122,14 @@ save(int rule, char *s) } static char * -parse_rulefrag(char *line) +parse_rule(char *s) { - int depth = 0; - char c, *s = line, *res = dict_; - if(s[0] == '(') { - while((c = *s++)) { - if(c == '(') { - depth++; - if(depth == 1) continue; - } - if(c == ')') { - --depth; - if(!depth) { - *dict_++ = 0; - return res; - } - } - *dict_++ = c; - } - } - while(!spacer(s[0]) && (*dict_++ = *s++)) + char *ss = walk(s), *d = dict_; + if(*s == '(') s++, ss--; + while((s < ss) && (*dict_++ = *s++)) ; *dict_++ = 0; - return res; + return d; } static int @@ -158,8 +142,8 @@ rewrite(void) if(p[0] == '<' && p[1] == '>') { Rule *r = &rules[rules_len++]; p += 3; - r->a = parse_rulefrag(p), p = walk(p) + 1; - r->b = parse_rulefrag(p), p = walk(p); + r->a = parse_rule(p), p = walk(p) + 1; + r->b = parse_rule(p), p = walk(p); return save(-1, p); } if(p == o || spacer(*(p - 1))) { @@ -204,7 +188,7 @@ main(int argc, char **argv) if(argc < 2) return !printf("usage: modal [-v] source.modal\n"); if(argc < 3 && argv[1][0] == '-' && argv[1][1] == 'v') - return !printf("Modal - Modal Interpreter, 7 Apr 2024.\n"); + return !printf("Modal - Modal Interpreter, 8 Apr 2024.\n"); if(!(f = fopen(argv[1], "r"))) return !printf("Invalid Modal file: %s.\n", argv[1]); while(fread(&c, 1, 1, f)) {