สมมุติว่าผมมีโปรแกรมเหมือนแล้ว:
let words = ["foo", "bar", "baz", "qux"]
for (var i = 0; i < words.length; i++) {
console.log(words[i])
}
ฉันต้องการให้ตัวกรองที่ AST และแค่เก็บ literals. ยังไงฉัน traverse ที่ AST เพื่อให้เท่านั้น"foo","บาร์"เป็นต้?
literals :: JSAST -> [String]
literals (JSAstProgram statements) = undefined
literals _ = []
ที่ทำดัชนีเทียบสีเส้นควรตัวกรองคน [JSStatement]
และจากนั้นดูเป็นไปได้สำหรับแสดง.
ถ้าการแสดงคืนพบโปรดตรวจสอบว่ามีการยึดตามตัวอักษรแบบนั้.
Lastly,แผนที่รายการจาก JSStatement
-> String
.
กำลังตามหาเป็นไปได้แสดงเป็นปัญหาสำหรับฉันตอนนี้หรอก ฉันจะตรงกับรูปแบบ:
f :: JSStatement -> a
f (JSLet _ expression _) = undefined
f (JSConstant _ expression _) = undefined
f (JsDoWhile _ _ _ _ expression _ _) = undefined
... etc
และจากนั้นสิ่งที่เหมือนกันเพื่อตามหาสำหรับการยึดตามตัวอักษรแบบนั้:
g :: JSExpression -> a
g (JSLiteral _ literal) = undefined
g (JSStringLiteral _ literal) = undefined
g (JSArrayLiteral _ literal _) = undefined
... etc
อย่างไรก็ตามนี่คือมา verbose และฉันรู้สึกเหมือนมีบางอย่างที่ดีกว่าข้างนอกนั่น ยังไงฉัน traverse ผ่าน AST และตัวกรองออกเดียวที่ literals ในทำความสะอาดและ concise ด้วยวาจาแบบนี้