Starting tokenizer
This commit is contained in:
parent
e78bc6f54a
commit
4cfda08fe9
88
src/modal.c
88
src/modal.c
|
@ -1,20 +1,92 @@
|
|||
#include <stdio.h>
|
||||
|
||||
/* dict */
|
||||
|
||||
static char dict[0x8000], *next = dict;
|
||||
|
||||
static char *
|
||||
save(char *s, char c)
|
||||
{
|
||||
char *o = next;
|
||||
while((*next++ = *s++) && *s)
|
||||
;
|
||||
*next++ = c;
|
||||
return o;
|
||||
}
|
||||
|
||||
static char *
|
||||
push(char *s, char c)
|
||||
{
|
||||
char *d = dict;
|
||||
for(d = dict; d < next; d++) {
|
||||
char *ss = s, *dd = d, a, b;
|
||||
while((a = *dd++) == (b = *ss++))
|
||||
if(!a && !b) return d;
|
||||
}
|
||||
return save(s, c);
|
||||
}
|
||||
|
||||
/* rule */
|
||||
|
||||
typedef struct {
|
||||
char *a;
|
||||
char *b;
|
||||
} Rule;
|
||||
|
||||
static int rules_len;
|
||||
static Rule rules[0x100];
|
||||
|
||||
static void
|
||||
addrule(FILE *f)
|
||||
{
|
||||
char c;
|
||||
printf("Add rule: ");
|
||||
while(f && fread(&c, 1, 1, f) && c && c != 0xa) {
|
||||
printf("%c", c);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/* program */
|
||||
|
||||
static char program[0x1000];
|
||||
|
||||
static void
|
||||
addprogram(FILE *f){
|
||||
char c;
|
||||
printf("Add program: ");
|
||||
while(f && fread(&c, 1, 1, f) && c && c != 0xa) {
|
||||
printf("%c", c);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static int phase;
|
||||
|
||||
static void
|
||||
tokenize(char *t, FILE *f)
|
||||
{
|
||||
if(t[0] == '<' && t[1] == '>') {
|
||||
addrule(f);
|
||||
return;
|
||||
}
|
||||
addprogram(f);
|
||||
}
|
||||
|
||||
static int
|
||||
walk(FILE *f)
|
||||
{
|
||||
char c, token[0x40], *cptr = token;
|
||||
char c, token[0x40], *tokptr;
|
||||
tokptr = token;
|
||||
while(f && fread(&c, 1, 1, f)) {
|
||||
if(c < 0x21) {
|
||||
*cptr++ = 0x00;
|
||||
printf("> %s\n", token);
|
||||
cptr = token;
|
||||
} else if(cptr - token < 0x3f)
|
||||
*cptr++ = c;
|
||||
if(c < 0x21)
|
||||
*tokptr++ = 0x00, tokenize(token, f), tokptr = token;
|
||||
else if(tokptr - token < 0x3f)
|
||||
*tokptr++ = c;
|
||||
else
|
||||
return printf("Token too long: %s\n", token);
|
||||
}
|
||||
*cptr++ = 0;
|
||||
*tokptr++ = 0x00, tokenize(token, f), tokptr = token;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<> (hello) (bye)
|
||||
<> (dup ?x) (?x ?x done)
|
||||
<> hello bye
|
||||
|
||||
hello world
|
||||
(dup hello)
|
Loading…
Reference in New Issue