8 typedef struct Symbol Symbol;
9 typedef struct SString SString;
11 enum { TSTRING = -2 };
24 #pragma varargck type "σ" SString*
36 if(v == nil) sysfatal("malloc: %r");
38 setmalloctag(v, getcallerpc(&n));
43 sstringaddsym(SString *a, Symbol *b)
45 a->d = realloc(a->d, (a->n + 1) * sizeof(Symbol *));
50 sstringappend(SString *a, SString *b)
52 a->d = realloc(a->d, (a->n + b->n) * sizeof(Symbol *));
53 memcpy(a->d + a->n, b->d, b->n * sizeof(Symbol *));
62 for(sp = &syms; *sp != nil; sp = &(*sp)->next)
63 if(name == (*sp)->name)
65 *sp = emalloc(sizeof(Symbol));
85 while(c >= 0 && c < 0x80 && isspace(c) && c != '\n');
91 if(p < strbuf + sizeof(strbuf) - 1)
103 if(peektok >= 0) return peektok;
104 return peektok = lex();
113 r = emalloc(sizeof(SString));
116 if(c == '\n' || c == ':')
119 r->d = realloc(r->d, (r->n + 1) * sizeof(Symbol *));
120 r->d[r->n++] = getsym(c);
131 s = va_arg(f->args, SString *);
132 for(i = 0; i < s->n; i++)
133 fmtprint(f, "%C", s->d[i]->name);
140 sysfatal("syntax error");
149 sstring = symstring();
151 if(peek() == '\n') {lex(); continue;}
152 if(peek() == ':') syntax();
156 s->rule = symstring();
158 if(lex() != TSTRING) syntax();
159 s->output = strdup(strbuf);
163 if(c != -1 && c != '\n') syntax();
173 r = emalloc(sizeof(SString));
174 for(i = 0; i < in->n; i++)
175 if(in->d[i]->rule == nil)
176 sstringaddsym(r, in->d[i]);
178 sstringappend(r, in->d[i]->rule);
187 fmtinstall(L'σ', fmtsstring);
188 Bin = Bfdopen(0, OREAD);
189 if(Bin == nil) sysfatal("Bfdopen: %r");
191 for(j = 0; j < 9; j++){
192 for(i = 0; i < sstring->n; i++)
193 if(sstring->d[i]->output != nil)
194 print("%s\n", sstring->d[i]->output);
196 sstring = iterate(sstring);