สิ่งแรกที่คุณต้องเข้าใจก็คือไม่มีใครบังคับให้คุณเขียนโปรแกรมแยกวิเคราะห์หรือคอมไพเลอร์ด้วยวิธีใดวิธีหนึ่ง โดยเฉพาะไม่จำเป็นว่าในกรณีที่ผลลัพธ์ของตัวแยกวิเคราะห์ต้องเป็นต้นไม้ สามารถเป็นโครงสร้างข้อมูลใด ๆ ที่เหมาะสมเพื่อแสดงถึงอินพุต
ตัวอย่างเช่นภาษาต่อไปนี้:
prog:
definition
| definition ';' prog
;
definition: .....
สามารถแสดงเป็นรายการของคำจำกัดความ (Nitpickers จะชี้ให้เห็นว่ารายการนั้นเป็นต้นไม้ที่เสื่อมโทรมแต่ทว่า)
ประการที่สองไม่จำเป็นต้องกดค้างไว้ที่แผนผังการแยกวิเคราะห์ (หรือโครงสร้างข้อมูลใด ๆ ที่โปรแกรมแยกวิเคราะห์ส่งคืน) ในทางตรงกันข้ามคอมไพเลอร์มักจะสร้างเป็นลำดับของการส่งผ่านที่แปลงผลลัพธ์ของการส่งผ่านก่อนหน้า ดังนั้นรูปแบบโดยรวมของคอมไพเลอร์จึงเป็นเช่นนี้:
parser :: String -> Maybe [Definitions] -- parser
pass1 :: [Definitions] -> Maybe DesugaredProg -- desugarer
pass2 :: DesugaredProg -> Maybe TypedProg -- type checker
pass3 :: TypedProg -> Maybe AbstractTargetLang -- code generation
pass4 :: AbstractTargetLang -> Maybe String -- pretty printer
compiler :: String -> Maybe String -- transform source code to target code
compiler source = do
defs <- parser source
desug <- pass1 defs
typed <- pass2 desug
targt <- pass3 typed
pass4 targt
บรรทัดด้านล่าง: ถ้าคุณได้ยินคนพูดคุยเกี่ยวกับต้นไม้แยก , ต้นไม้ syntac นามธรรม , ต้นไม้ไวยากรณ์คอนกรีตฯลฯ มักจะใช้แทนโดยโครงสร้างข้อมูลที่เหมาะสมสำหรับวัตถุประสงค์ที่กำหนดและคุณกำลังดี