-tok(R) ::= BSLASH non_nl(T) . { R = buffer_new(); buffer_add(R, T.s, T.len); }
-tok(R) ::= QUOTE sqtok(T) QUOTE . { R = T; }
-tok(R) ::= DQUOTE dqtok(T) DQUOTE . { R = T; }
-
-%type token_acc { buffer_t* }
-token_acc(A) ::= tok(T) . { A = T; }
-token_acc(C) ::= token_acc(A) tok(B) . { C = buffer_merge(A, &B); }
-
+dqtok(Z) ::= dqtok(A) BQUOTE bqtok(B) BQUOTE . { /* XXX */ buffer_merge(Z = A, &B); }
+
+/* unquoted tokens */
+%type uqtok { buffer_t* }
+%destructor uqtok { buffer_delete(&$$); }
+uqtok(Z) ::= BSLASH non_nl(A) . { buffer_add(Z = buffer_new(), A.s, A.len); }
+uqtok(Z) ::= svar(A) . { substvar(Z = buffer_new(), A); }
+uqtok(Z) ::= ATOM|EQUAL|LBRACE|RBRACE(A) . { buffer_add(Z = buffer_new(), A.s, A.len); }
+uqtok(Z) ::= SQUOTE sqtok(A) SQUOTE . { Z = A; }
+uqtok(Z) ::= DQUOTE dqtok(A) DQUOTE . { Z = A; }
+uqtok(Z) ::= BQUOTE bqtok(A) BQUOTE . { /* XXX */ Z = A; }
+
+/* token accumulator */