因此,我正在通过"normalizing" a JS AST以特定的方式工作,以便更容易地将代码转换为特定的目标语言。所以我必须了解AST的内部细节。然后为了测试,我使用print functions将它转换回JS源代码。到目前为止,我几乎处理过每一个案例,但TemplateLiteral似乎是一个奇怪的结构。
例如,您具有以下模板字符串:
const str = 'const b83 = `foo${a100} bar ${b82}`'将该str解析为一个AST,您会得到以下结构:
{
"type": "TemplateLiteral",
"start": 2692,
"end": 2715,
"expressions": [
{
"type": "Identifier",
"start": 2698,
"end": 2702,
"name": "a100"
},
{
"type": "Identifier",
"start": 2710,
"end": 2713,
"name": "b82"
}
],
"quasis": [
{
"type": "TemplateElement",
"start": 2693,
"end": 2696,
"value": {
"raw": "foo",
"cooked": "foo"
},
"tail": false
},
{
"type": "TemplateElement",
"start": 2703,
"end": 2708,
"value": {
"raw": " bar ",
"cooked": " bar "
},
"tail": false
},
{
"type": "TemplateElement",
"start": 2714,
"end": 2714,
"value": {
"raw": "",
"cooked": ""
},
"tail": true
}
]
}请注意,“expression”和"quasis“并不是交错的,它们被放入单独的数组中。我如何返回并正确地将它们放在正确的顺序中,以便重新生成模板字符串源代码?假设这个AST节点可能是一个更大的AST的一部分,并且树可能会被重写,所以您使用的关于开始和结束文本位置的任何信息都将只从相对的角度有用,而不是绝对的。我只是不太确定阅读开头和结尾以重新交错表达式和quasis的最佳方式。
发布于 2021-11-18 18:10:57
你将永远拥有quasis.length == expressions.length+1。你只需要取第一个准,然后是第一个表达式,然后是下一个准,然后是下一个表达式,依此类推,直到最后一个准。
https://stackoverflow.com/questions/70023238
复制相似问题