如何用PEG.js实现类似TypeScript的数组类型语法?遇栈溢出问题
解决PEG.js实现TypeScript数组类型语法的栈溢出问题
你写的代码出现栈溢出,核心是无限递归:type规则优先匹配array,而array规则又要先匹配type,PEG.js会不断在这两个规则里循环调用,直到栈被撑爆。
直接调整规则结构,把数组定义成基础类型的后缀,就能彻底避免这个问题,修复后的语法如下:
start = type type = baseType arraySuffix* { // 把多个[]转换成嵌套的array结构 return arraySuffix.reduce((acc, _) => ({ kind: "array", type: acc }), baseType); } baseType = bool / string / int string = "string" { return { kind: "string" }} int = "int" { return { kind: "int" }} bool = "bool" { return { kind: "bool" }} arraySuffix = "[]"
修复逻辑说明
- 拆分出
baseType专门处理基础类型(bool/string/int),彻底切断和数组规则的递归依赖 type规则先匹配基础类型,再匹配任意数量的[]后缀,用reduce把多个连续的[]转换成嵌套的数组结构,比如int[][]会被解析成{ kind: "array", type: { kind: "array", type: { kind: "int" } }}- 既符合TypeScript数组类型的语法逻辑,又完全避免了无限递归的问题
内容的提问来源于stack exchange,提问作者Aidin53
相关产品推荐
相关产品推荐

