所以我正在以某種方式“規范化”一個 JS AST,以便更容易地翻譯成特定的目標語言。所以我必須學習 AST 的內部細節。然后為了測驗,我使用列印函式將其轉換回 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
}
]
}
請注意,“運算式”和“準”不是交錯的,它們被制成單獨的陣列。我如何回傳并以正確的順序正確放置它們以重新生成模板字串源代碼?假設這個 AST 節點可能是更大 AST 的一部分,并且樹可能會被重寫,因此您使用的關于開始和結束文本位置的任何資訊都只會從相對而非絕對的角度有用。我只是不太確定閱讀開頭和結尾以重新交錯表達和準的最佳方式。
uj5u.com熱心網友回復:
你總會有的quasis.length == expressions.length 1。您只需取第一個準,然后是第一個運算式,然后是下一個準,然后是下一個運算式,依此類推,直到最后一個準。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/362059.html
標籤:javascript 算法 抽象语法树
上一篇:C :如何用''(空格)而不是'\'(反斜杠空格)分割字串?
下一篇:合并兩個沒有重復的鏈表
