Anlamanız gereken ilk şey, kimsenin sizi belirli bir şekilde bir ayrıştırıcı veya derleyici yazmaya zorlamamasıdır. Özellikle, ayrıştırıcının sonucunun bir ağaç olması zorunlu değildir. Girdiyi temsil etmeye uygun herhangi bir veri yapısı olabilir.
Örneğin, aşağıdaki dil:
prog:
definition
| definition ';' prog
;
definition: .....
tanım listesi olarak gösterilebilir. (Nitpickers bir liste olduğuna işaret edecektir olduğunu dejenere ağaç, ama neyse.)
İkincisi, ayrıştırma ağacını (veya ayrıştırıcının döndürdüğü veri yapısını) tutmaya gerek yoktur. Aksine, derleyiciler genellikle bir önceki geçişin sonuçlarını dönüştüren bir geçiş dizisi olarak oluşturulur. Bu nedenle bir derleyicinin genel düzeni şu şekilde olabilir:
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
Bottom Line: İnsanların söz duyarsanız ayıran ağaçlar , soyut Syntac ağaçları , beton sözdizimi ağaçları hep, vb yerine verilen amaç için uygun veri yapısı sen ceza ve.