我有一个基于PEG的解析器,处理文本输入。除常规宏外,它还支持嵌套 - 宏内的宏。
我的代码挂钩处理器功能 - async macroBuilder()
包装每个visit()
- 用于处理Promise
中特定类型宏的方法:
dateMath(obj) {
const dateAttribs = { format: obj.format };
switch (dateAttribs.format) {
...
default:
fragments.push(
new Promise((resolve, reject) => {
resolve(moment(now).format(dateAttribs.format));
});
);
break;
}
}
要处理嵌套宏,我会这样做:
nestedSnippet(obj) {
fragments.push(
processSingleShortcut(constants.SHORTCUT_PREFIX.concat(obj.name), true)
.then(res => {
let result = macroBuilder(res, { retainWhitespace: true, nestedLevel: nestedLevel+1 }, clipboard, window.now);
return result;
})
.catch(() => {
console.log(`couldn't find match for nested snippet: ${obj.name}`);
})
);
}
最后,我做Promise.all()
并将所有部分连成一个字符串。
但是,看起来嵌套部分无法正常工作,就像我想要的那样。我的想法是推进fragments
一个Promise
,在解决时将会:
processSingleShortcut()
macroBuilder()
macroBuilder()
我需要这个,因为除了返回字符串之外,宏处理可能有副作用,我需要以前所有宏中的那些来正确处理fragments
数组中的下一个。
因此,我需要在评估之后的宏之前已经处理嵌套。它似乎没有包围嵌套宏的承诺,我需要。