0

アセンブリ コードを解析する賢い方法を考え出そうとしています。たとえば、レジ​​スタに 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

動作しますが、エラー メッセージに解析状態の痕跡が含まれており、残念です。

それを行う最良の方法は何ですか?この種のことを行うための追加のライブラリはありますか?

4

1 に答える 1

1

エラーメッセージを抽出してみる

getErrorMessage (ParseError p xs) = show p ++ concat $ map messageString xs
于 2013-08-07T18:43:09.667 に答える