#include #include enum Token { LINVALID, LEND, LRIGHT, LLEFT, LINC, LDEC, LOUT, LIN, LLOOP, LENDL, }; enum Symbol { INVALID, END, RIGHT, LEFT, INC, DEC, OUT, IN, LOOP, ENDL, }; typedef struct Sym Sym; struct Sym { int inst; Sym *loop; Sym *next; }; typedef struct Bf { int *i; // instructions size_t in; // instructions number size_t is; // instructions size unsigned char *d; // data int *ip; // instruction pointer unsigned char *dp; // data pointer } Bf; void * emalloc(size_t s) { void *p; p = malloc(s); if(!p){ fprintf(stderr, "Error: Out of memory.\n"); exit(EXIT_FAILURE); } return p; } void * erealloc(void *p, size_t s) { p = realloc(p, s); if(!p){ fprintf(stderr, "Error: Out of memory.\n"); exit(EXIT_FAILURE); } return p; } int lex(FILE *f, size_t *l, size_t *b) { int c; while((c = fgetc(f)) != EOF){ switch(c){ default: fprintf(stderr, "Error: Invalid character at line %zu column %zu: %c\n", *l, *b, c); exit(EXIT_FAILURE); case '>': return LRIGHT; case '<': return LLEFT; case '+': return LINC; case '-': return LDEC; case '.': return LOUT; case ',': return LIN; case '[': return LLOOP; case ']': return LENDL; case '\n': *l += 1; *b = 0; break; } } if(ferror(f)){ fprintf(stderr, "Error: I/O error when reading file\n"); exit(EXIT_FAILURE); } return LEND; } Sym * parse(FILE *f) { int t; size_t l, b; Sym **stk; size_t stkn, stks; Sym *h; Sym *n; Sym **p; l = 1; b = 1; stkn = 0; stks = sizeof(*stk); stk = emalloc(stks); for(p = &h; (t = lex(f, &l, &b)) != LEND;){ *p = emalloc(sizeof(**p)); n = *p; n->inst = INVALID; n->loop = 0; n->next = 0; switch(t){ default: fprintf(stderr, "Error: Invalid token at line %zu column %zu: %d\n", l, b, t); exit(EXIT_FAILURE); case LRIGHT: n->inst = RIGHT; p = &n->next; break; case LLEFT: n->inst = LEFT; p = &n->next; break; case LINC: n->inst = LINC; p = &n->next; break; case LDEC: n->inst = LDEC; p = &n->next; break; case LOUT: n->inst = OUT; p = &n->next; break; case LIN: n->inst = IN; p = &n->next; break; case LLOOP: n->inst = LOOP; p = &n->loop; if(stkn >= stks){ stk = erealloc(stk, 2 * stks); } stk[stkn++] = n; break; case LENDL: n->inst = ENDL; if(stkn <= 0){ fprintf(stderr, "Error: Too many loop endings at line %zu column %zu.\n", l, b); exit(EXIT_FAILURE); } n = stk[--stkn]; p = &n->next; break; } } if(stkn > 0){ fprintf(stderr, "Error: Not enough loop endings.\n"); exit(EXIT_FAILURE); } free(stk); return h; } void emit() { } void run() { } int main(void) { Sym *s; s = parse(stdin); printf("lol\n"); return EXIT_SUCCESS; }