3

私はパーサーのテストを書いていましたが、これは最善ではないかもしれませんが、これまでのところうまくいきました。テストは、次のように、すべてのコード ブロックに対して完全に定義された AST 表現を想定しています。

(parse "x = 5") `shouldBe` (Block [Assignment [LVar "x"] [Number 5.0]])

しかし、より複雑なケースに移ると、より「あいまいな」検証が必要になりました。

(parse "t.x = 5") `shouldBe` (Block [Assignment [LFieldRef (Var "t") (StringLiteral undefined "x")] [Number 5.0]])

この例ではundefined、解析結果と比較したくないフィールドを示しています (文字列リテラルのソース位置です)。現在、私が見ている唯一の修正方法は、コードを書き直して のshouldSatisfy代わりに使用するshouldBeことです。他の解決策が見つからない場合は、これを行う必要があります。

4

2 に答える 2

1

AST 内のすべての位置データを何らかの固定値にnormalizePosition置き換える関数を作成し、同じダミー値から構築されたパターンに対して使用できます。dummyPositionshouldBe

AST が非常に複雑な場合は、Scrap-Your-Boilerplate を使用してこの正規化を記述することを検討してください。

于 2014-09-17T12:19:38.917 に答える
0

これを解決する 1 つの方法は、ソースの場所で AST をパラメーター化することです。

{-# LANGUAGE DeriveFunctor #-}

data AST a = ...
  deriving (Eq, Show, Functor)

あなたのparse関数はASTwithを返しますSourceLocations:

parse :: String -> AST SourceLocation

上記のインスタンスを派生させたのでFunctor、ソースの場所を別のものに簡単に置き換えることができます()

import Data.Functor ((<$))

parseTest :: String -> AST ()
parseTest input = () <$ parse input

今、仕様parseTestの代わりに使用してください。parse

于 2014-11-01T05:09:14.180 に答える