Результат работы:import qualified Data.Map as M import Control.Monad.State -- Типа, команда. step = modify (\(a,is,labels,alllabels) -> (a+1,("s "++show a):is,labels,alllabels)) -- Типа, определить метку. label name = modify (\(a,is,labels,alllabels) -> (a,is,upd a labels,alllabels)) where upd addr labels = case M.lookup name labels of Just _ -> error $ "Label "++name++" redefined." _ -> M.insert name addr labels -- Переход, типа. Вычисление дистанции до метки, будь то вперед или назад. -- Ну, и симуляция инструкции. jump name = modify (\(a,is,labels,alllabels) -> (a+1,d a alllabels:is,labels,alllabels)) where d a alllabels = case M.lookup name alllabels of Nothing -> error $ "Undefined "++name Just la -> "j "++show a++" + "++show (la-a) -- Как запустить вычисление ассемблерных команд: prog p = let (_,is,alllabels,_) = execState p (0,[],M.empty,alllabels) in reverse is -- Типа, программа на ассемблере: p = do label "a" step step jump "b" jump "a" step step label "b" -- Типа, проверка результатов вычислений смещений: testp = prog p
Вот меня интересует, сложно ли сделать похожий ассемблер с помощью любого императивного языка?*Main> testp ["s 0","s 1","j 2 + 4","j 3 + -3","s 4","s 5"]
Товарищи с RSDN "проблем не видят." ;)