আপনার প্রথমে বুঝতে হবে যে কেউ আপনাকে কোনও নির্দিষ্ট উপায়ে পার্সার বা সংকলক লিখতে বাধ্য করে না। বিশেষত, এটি অবশ্যই প্রয়োজন হয় না যে পার্সারের ফলাফল অবশ্যই একটি গাছ হতে পারে। এটি কোনও ডেটা স্ট্রাকচার হতে পারে যা ইনপুট উপস্থাপনের জন্য উপযুক্ত।
উদাহরণস্বরূপ, নিম্নলিখিত ভাষা:
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
নীচের লাইন: আপনি যদি লোককে পার্স গাছ , বিমূর্ত সিনট্যাক গাছ , কংক্রিট সিনট্যাক্স গাছ ইত্যাদির বিষয়ে কথা শুনতে পান তবে সর্বদা প্রদত্ত উদ্দেশ্যে উপযুক্ত ডেটা কাঠামোর পরিবর্তে , এবং আপনি ভাল আছেন।