如何对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

这是我在这里找到的单声道版本

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章