Added I/O

This commit is contained in:
Devine Lu Linvega 2024-04-06 15:48:17 -07:00
parent afe94cf84b
commit 44d5893139
4 changed files with 15 additions and 8 deletions

View File

@ -0,0 +1,3 @@
<> ((send ?:)) ()
(send (hello world))

View File

@ -1,3 +1,5 @@
<> ((read)) (?:)
<> ((send ?:)) () <> ((send ?:)) ()
<> (?x ?y catswap) ((?y ?x))
(send (hello world)) (send (You said: )) (read) send catswap

View File

@ -8,10 +8,10 @@ all: dest bin/modal
dest: dest:
@ mkdir -p bin @ mkdir -p bin
run: all run: all
@ bin/modal examples/test.modal 2> /dev/null @ bin/modal examples/test.modal "(arg1)" "(arg2)" "(arg3)"
test: all test: all
@ bin/modal -v @ bin/modal -v
@ bin/modal examples/test.modal @ bin/modal examples/test.modal 2> /dev/null
install: all install: all
cp bin/modal ~/bin/ cp bin/modal ~/bin/
uninstall: uninstall:

View File

@ -4,7 +4,7 @@ typedef struct {
char *a, *b; char *a, *b;
} Rule; } Rule;
static int rules_len, direction = 0; static int rules_len, direction, queue;
static Rule rules[0x100]; static Rule rules[0x100];
static char dict[0x8000], *dict_ = dict; static char dict[0x8000], *dict_ = dict;
static char bank_a[0x4000], *prog_ = bank_a; static char bank_a[0x4000], *prog_ = bank_a;
@ -77,10 +77,11 @@ match(char *p, Rule *r)
} }
static int static int
bind(char r) bind(char r, char *incoming)
{ {
int depth = 0; int depth = 0;
char c, *s = regs[(int)r]; char c, *s = regs[(int)r];
if(r == ':' && incoming != NULL) s = incoming, queue++;
if(!s) return !fprintf(stderr, "?%c Empty\n", r); if(!s) return !fprintf(stderr, "?%c Empty\n", r);
if(s[0] == '(') { if(s[0] == '(') {
while((c = *s++)) { while((c = *s++)) {
@ -147,7 +148,7 @@ addrule(char *s)
} }
static int static int
rewrite(void) rewrite(char *incoming)
{ {
char c, *p = direction ? bank_b : bank_a; char c, *p = direction ? bank_b : bank_a;
while((c = *p)) { while((c = *p)) {
@ -167,7 +168,7 @@ rewrite(void)
char cc, *b = r->b; char cc, *b = r->b;
while((cc = *b++)) { while((cc = *b++)) {
if(cc == '?') if(cc == '?')
bind(*b++); bind(*b++, incoming);
else else
*outp_++ = cc; *outp_++ = cc;
} }
@ -206,8 +207,9 @@ main(int argc, char **argv)
return !printf("Modal - Modal Interpreter, 4 Apr 2024.\n"); return !printf("Modal - Modal Interpreter, 4 Apr 2024.\n");
if(!(f = fopen(argv[1], "r"))) if(!(f = fopen(argv[1], "r")))
return !printf("Invalid Modal file: %s.\n", argv[1]); return !printf("Invalid Modal file: %s.\n", argv[1]);
queue = 2;
fread(bank_a, 1, 0x1000, f), fclose(f); fread(bank_a, 1, 0x1000, f), fclose(f);
while(rewrite()) while(rewrite(argv[queue]))
; ;
print_rules(); print_rules();
return 0; return 0;