diff --git a/src/modal.c b/src/modal.c index 96b23e5..6e3541a 100644 --- a/src/modal.c +++ b/src/modal.c @@ -9,8 +9,25 @@ static Rule rules[0x100]; static char dict[0x8000], *next = dict; static char program[0x1000], *prog_ = program; +static int +reduce(void) +{ + return 1; +} + +static void +display(void) +{ + int i; + for(i = 0; i < rules_len; i++) { + Rule *r = &rules[i]; + printf("Rule #%d: %s -> %s\n", i, r->a, r->b); + } + printf("Program: %s\n", program); +} + static char * -addside(FILE *f) +parse_rulefrag(FILE *f) { int depth = 0; char c, *origin = next; @@ -27,44 +44,21 @@ addside(FILE *f) } static void -addrule(FILE *f) -{ - Rule *r = &rules[rules_len++]; - r->a = addside(f), r->b = addside(f); -} - -static void -addprogram(FILE *f) +tokenize(char *t, FILE *f) { char c; + if(t[0] == '<' && t[1] == '>') { + Rule *r = &rules[rules_len++]; + r->a = parse_rulefrag(f), r->b = parse_rulefrag(f); + return; + } while(f && fread(&c, 1, 1, f) && c && c != 0xa) *prog_++ = c; *prog_++ = 0x20; } -static void -tokenize(char *t, FILE *f) -{ - if(t[0] == '<' && t[1] == '>') { - addrule(f); - return; - } - addprogram(f); -} - -static void -display() -{ - int i; - for(i = 0; i < rules_len; i++) { - Rule *r = &rules[i]; - printf("Rule #%d: %s -> %s\n", i, r->a, r->b); - } - printf("Program: %s\n", program); -} - static int -eval(char *path) +parse(char *path) { FILE *f; char c, token[0x40], *tokptr; @@ -80,7 +74,6 @@ eval(char *path) return printf("Token too long: %s\n", token); } *tokptr++ = 0x00, tokenize(token, f), tokptr = token; - display(); fclose(f); return 1; } @@ -92,5 +85,7 @@ main(int argc, char **argv) return !printf("usage: modal [-v] source.modal\n"); if(argc < 3 && argv[1][0] == '-' && argv[1][1] == 'v') return !printf("Modal - Modal Interpreter, 3 Apr 2024.\n"); - return !eval(argv[1]); + parse(argv[1]); + display(); + return !reduce(); } \ No newline at end of file diff --git a/test.modal b/test.modal index 03d47e7..71a866d 100644 --- a/test.modal +++ b/test.modal @@ -2,4 +2,4 @@ <> hello bye <> (a (b (c))) (end) -(dup hello) \ No newline at end of file +hello world \ No newline at end of file