3122
|
1 #include <stdio.h>
|
|
2 #define c g->code
|
|
3 #define p g->pointer
|
|
4 #define f g->file
|
|
5
|
|
6 struct Data {
|
|
7 const char *code;
|
|
8 char vars[30000];
|
|
9 char *pointer;
|
|
10 };
|
|
11
|
|
12 void dummyLexer(struct Data *g) { while(*c) if(*c++ == ']') return; }
|
|
13
|
|
14 void lexer(struct Data *g) {
|
|
15 const char *cc = c;
|
|
16 while(*c) {
|
|
17 switch (*c++) {
|
|
18 case '>':
|
|
19 ++p;
|
|
20 break;
|
|
21
|
|
22 case '<':
|
|
23 --p;
|
|
24 break;
|
|
25
|
|
26 case '+':
|
|
27 ++*p;
|
|
28 break;
|
|
29
|
|
30 case '-':
|
|
31 --*p;
|
|
32 break;
|
|
33
|
|
34 case '.':
|
|
35 putchar(*p);
|
|
36 break;
|
|
37
|
|
38 case ',':
|
|
39 *p = getchar();
|
|
40 break;
|
|
41
|
|
42 case '[':
|
|
43 cc = c;
|
|
44 if(!*p) dummyLexer(g);
|
|
45 while(*p) {
|
|
46 c = cc; // restore char position to start of loop
|
|
47 lexer(g);
|
|
48 }
|
|
49 break;
|
|
50
|
|
51 case ']':
|
|
52 return;
|
|
53
|
|
54 default:
|
|
55 // everything else is comments
|
|
56 break;
|
|
57 }
|
|
58 }
|
|
59 return;
|
|
60 }
|
|
61 /*
|
|
62 * Usage:
|
|
63 * struct Data g;
|
|
64 * g.code = file;
|
|
65 * g.pointer = &g.data[15000];
|
|
66 * lexer(&g);
|
|
67 */
|