这个嵌套算法的名称是什么
What is the name of this nesting algorithm?
我正在编写一个包含嵌套作用域的解析器。在解析器计算完标记的深度后,我想将它们嵌套在适当的位置,以简化标记生成器的工作。
将{ depth: 1, value: '...' }
简化为1
,
[1, 2, 3, 3, 2, 1, 3, 2, 1]
应给予[1, [2, [3, 3], 2], 1 [[3], 2], [1]]
我用这个递归函数(使用lodash,但我想可以理解为香草)达到了预期的结果:
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]]
这个特定的模式/操作有名字吗?有更好的方法吗?
值得注意的是,您在某种程度上混合了标记器和解析器的角色。令牌的"深度"是一个解析时间属性,在令牌化过程中通常不会对其进行标记。相反,一个典型的标记化器会吐出这样的东西(使用L和R作为假想的左右分隔符):
[1, L, 2, L, 3, 3, R, 2, R, 1, L, L, 3, R, 2, R, 1]
解析器的工作是创建"层次结构",并将其转换为有意义的树状或嵌套数组结构。
我不知道你特别提到的算法,但我相信你在解析器方面看到的是一个从左到右自上而下的解析器,特别是LL(1)解析器。
相关文章:
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 将自然数转换为三位字符串的简单算法是什么
- 这个算法的非jquery等价物(纯JavaScript)是什么
- Gridster.js中更新瓦片位置的算法是什么
- 堆栈溢出背后的算法是什么? ajax标记搜索字段
- Word Ladder,Javascript:我使用的是什么算法和数据结构
- 这个嵌套算法的名称是什么
- html5画布用于调整图像大小的算法是什么
- photoshop将rgb转换为cmyk的百分比算法是什么
- Node.js的目的是什么?[例如:在服务器上可用的数据集上实现图形算法]