我如何单元测试Alex代码?

我正在用monad封装器在Alex里写一个词法分析器。 它不像我预期的那样行事,我想为它编写一些单元测试。 通过执行以下操作,我可以为单个令牌编写单元测试:

runAlex "foo" alexMonadScan `shouldBe` Right TokenFoo

但我不知道如何测试字符串“foo bar”变得[TokenFoo, TokenBar]

鉴于Token是我的令牌类型,我需要一个像runAlex这样的函数,它的类型为String -> Alex [Token] -> Either String [Token] ,但我不知道如何转换alexMonadScan以便它具有键入Alex [Token]而不是Alex Token

我试过了

runAlex "foo bar" (liftM (:[]) alexMonadScan) `shouldBe` [TokenFoo, TokenBar]

这似乎是正确的类型,但它返回Right [TokenEOF] ,显然放弃了它沿途看到的令牌。

我怎样才能做到这一点?


有一个函数alexScanTokens :: String -> [token]可以使用。

它在文件templates/wrappers.hs定义

这里是我在这里找到的一个monadic版本:

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
链接地址: http://www.djcxy.com/p/65637.html

上一篇: How can I unit test Alex code?

下一篇: How do Happy and Alex bootstrap themselves into being?