sweet-js/sweet-core

in syntax templates don't greedily tokenize dollar before curly brace

disnet opened this issue · 4 comments

eg:

#`foo${...}`

So you're saying this should be tokenized as foo$ and {...}?

If so, I would find this behavior surprising as it is at odds w/ template literal syntax.

I also would find that behavior surprising...it's the current behavior :)

syntax m = function (ctx) {
  return #`foo${x}`;
}
m

expands to:

foo$;
{
  x;
}

Sorry for the unclear issue description. Was in a rush the other day.

Haha! The title is a directive, not a description.

I know what's going on and think I have a solution. I'll check it out tonight.

It's never as easy as I think. The source of the problem is simple. Syntax templates are being lexed as regular source strings, bookended by LSYNTAX and RSYNTAX tokens. They are then parsed and the identifier $ coming before {...} is consumed. This doesn't work for foo${...} as foo$ is a valid identifier.

My first thought was to make $ a terminating character. But that fails unless it's followed by {.

Another strategy is to tokenize syntax templates just as we do string templates. Then do a second pass and run the template elements through the reader. This might work as a hack, but source information (line & column number) is gonna be all messed up.

The "correct" answer is probably to add multi-character dispatch. It looks like more and more weight is building up to a rewrite of the reader.

As soon as things die down a bit at work I plan to prototype something in PureScript using parser combinators.