我正在创建我的宏,并且有一个错误而不是随机弹出(从我的角度来看):
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%7D%0A%0A(foo%20test%20?)%0A
所以请,这让我发疯,我一次又一次地面对这个错误。它应该与:expr
运算符相关,但我无法用...
替换它,因为它非常贪婪,并且它会选择它找到的最后一个?
。
我可以看到该行而不是抛出此错误是here。但我不知道背景。
任何帮助?
答案 0 :(得分:0)
感谢@natefaubion我有一个答案,它是一个错误,因为它将?
解释为三元运算符并失败,因为它无法找到表达式的其余部分。
另外,对于我的具体情况,自定义模式类(而不是:expr)将是更好的解决方案。这个想法在这里提出:https://github.com/mozilla/sweet.js/issues/203。
现在,一个肮脏的解决方法是使用case
手动解析模式:http://bit.ly/1aPmwyX
正如@natefaubion所说
这不是一个很好的答案!它的工作原理(种类),但1)有三元运算符被如何构成的错误2)你真正想要的是可扩展模式类。