アセンブリ コードを解析する賢い方法を考え出そうとしています。たとえば、レジスタに 0 から 31 までの番号が付けられている場合、受け入れたいのですが、受け入れたく$31
ありません$32
。
1) 位置情報を使用したいので、ソース コードを解析しながらこれらを実行したいと思います。2) シンプルが好きです。
私の最良のアイデアは、特別なパーサーを使用して失敗を示すことです。
たとえば、私は書くことができます
import Text.Parsec hiding (label)
import Text.Parsec.Token
import Text.Parsec.Language (emptyDef)
import Text.Parsec.String
import Text.Parsec.Expr
import Text.Parsec.Perm
data Register = Register Integer
deriving (Eq, Ord, Show)
register :: Parser Register
register = do char '$'
n <- onlyWhen "Register number must be between 0 and 31"
(\n -> n >= 0 && n <= 31) (decimal p)
return $ Register n
onlyWhen :: String -> (a -> Bool) -> Parser a -> Parser a
onlyWhen mess pred pars
= do r <- pars
if pred r then return r
else fail mess
p = makeTokenParser emptyDef
動作しますが、エラー メッセージに解析状態の痕跡が含まれており、残念です。
それを行う最良の方法は何ですか?この種のことを行うための追加のライブラリはありますか?