Javascript Sweet.js:Error:ASSERT:enforest假设有令牌可以使用

Javascript Sweet.js:Error:ASSERT:enforest假设有令牌可以使用,javascript,sweet.js,Javascript,Sweet.js,我正在创建宏,但有一个bug(在我看来)会随机弹出: ASSERT: enforest assumes there are tokens to work with 我不确定这意味着什么,但我尽了最大努力来封装问题,并以以下代码结束: macro foo { rule { $bar:expr ? } => { $bar } rule { $bar:expr } => { $bar } } 如果在括号之间调用foo宏,并在末尾添加?,则会引发此错误: (foo test ?)

我正在创建宏,但有一个bug(在我看来)会随机弹出:

ASSERT: enforest assumes there are tokens to work with
我不确定这意味着什么,但我尽了最大努力来封装问题,并以以下代码结束:

macro foo {
  rule { $bar:expr ? } => { $bar }
  rule { $bar:expr } => { $bar }
}
如果在括号之间调用
foo
宏,并在末尾添加
,则会引发此错误:

(foo test ?)
// produces ASSERT: enforest assumes there are tokens to work with
但是如果我去掉括号或
它就可以工作了

foo test ?
// produces: test
(foo test)
// produces: test
你可以在这里看到它失败了:

http://sweetjs.org/browser/editor.html#macro%20foo%20%7B%0A%20%20rule%20%7B%20$bar:expr%20?%20%7D%20=%3E%20%7B%20$bar%20%7D%0A%20%20rule%20%7B%20$bar:expr%20%7D%20=%3E%20%7B%20$bar%20%7D%0A%0A(foo%20test%20?%0A

所以拜托,这让我发疯了,我一次又一次地面对这个错误。它应该与
:expr
操作符相关,但我不能用
替换它,因为它太贪婪了,它选择了它找到的最后一个
的所有内容

我可以看到这条线比抛出这个错误是。但我不知道上下文


有什么帮助吗?

感谢@natefaubion,我有一个答案,这是一个错误,因为它将
解释为三元运算符,并且由于找不到表达式的其余部分而失败

对于我的特定情况,自定义模式类(而不是:expr)将是更好的解决方案。这里提出了这个想法:

目前,一个棘手的解决方法是使用
案例
手动解析模式:

正如@natefaubion所说的

这不是一个好答案!它可以工作(有点),但1)三元运算符的执行方式存在缺陷2)您真正想要的是可扩展的模式类