我正在编写一个包含嵌套作用域的解析器。解析器完成计算令牌的深度后,我想将它们嵌套到位以简化令牌器的工作。
将{ depth: 1, value: '...' }
简化为1
,
[1, 2, 3, 3, 2, 1, 3, 2, 1]
应该[1, [2, [3, 3], 2], 1 [[3], 2], [1]]
我使用这个递归函数(使用lodash达到了预期的结果,但我认为这可以理解为vanilla):
var arr = [1, 2, 3, 3, 2, 1, 3, 2, 1];
var tokens = (function nestDeeperTokens(tokenArray, level){
var nestedTokens = _.reduce(tokenArray, function(m, v, i){
if (v == level) { m.push(v); return m; }
if (_.isArray(_.last(m))) { m[m.length - 1].push(v); return m; }
m.push([v]); return m;
}, []);
return _.map(nestedTokens, function(v){
return _.isArray(v) ? nestDeeperTokens(v, level + 1) : v;
});
})(arr, 1);
// => [1, [2, [3, 3], 2], 1 [[3], 2], [1]]
此特定模式/操作是否有名称?有没有更好的方法呢?
答案 0 :(得分:1)
值得注意的是,您在某种程度上混合了tokenizer和解析器的角色。 "深度"令牌是解析时属性,通常在标记化期间不会标记。相反,典型的标记化器会吐出类似的东西(使用L和R作为假想的左右分隔符):
[1, L, 2, L, 3, 3, R, 2, R, 1, L, L, 3, R, 2, R, 1]
解析器的工作是创建"层次结构"并将其转换为有意义的树状或嵌套数组结构。
我不知道你特别提到的算法算法,但我相信你在解析器方面所看到的是一个从左到右的自上而下的解析器,特别是{{ 3}}