struct { char *prefix; union { } what; enum xxx type; struct xxx next; } readglue(s) char *s; { for (p = s; *p; p++) { switch (*p) { case '$': switch (p[1]) { case '\0': Error.... case '{': ++p; append inlineGlue(&p); /* quits at } and swallows it */ default: { error; } } break; default: *result++ = *p; } } } inlineglue(pp, xxx) char **pp; struct... { while t = getToken() != KET { switch (t) { case word: append VAR word; break; case IF: e = expression; } } }