我正在使用monad包装器在Alex中写一个词法分析器。它不像我期望的那样,我想为它编写一些单元测试。我可以通过执行以下操作来编写单个测试以进行单个令牌:
runAlex "foo" alexMonadScan `shouldBe` Right TokenFoo
但我不知道如何测试字符串“foo bar”是否被列为[TokenFoo, TokenBar]
。
鉴于Token
是我的令牌类型,我需要类似runAlex
的函数,其类型为String -> Alex [Token] -> Either String [Token]
,但我不知道如何转换{{1}所以它的类型为alexMonadScan
而不是Alex [Token]
。
我试过
Alex Token
似乎有正确的类型,但它会返回runAlex "foo bar" (liftM (:[]) alexMonadScan) `shouldBe` [TokenFoo, TokenBar]
,显然会丢掉它在途中看到的令牌。
我怎样才能做到这一点?
答案 0 :(得分:4)
您可以使用功能alexScanTokens :: String -> [token]
。
在文件templates/wrappers.hs
这是我发现here的一个版本:
alexScanTokens :: String -> Either String [Keyword]
alexScanTokens inp = runAlex inp gather
where
gather = do
t <- alexMonadScan
case trace (show t) t of
EOF -> return [EOF]
_ -> (t:) `liftM` gather