unit-testing - 我如何对 Alex 代码进行单元测试?

标签 unit-testing haskell monads lexer

我正在使用 monad 包装器在 Alex 中编写词法分析器。它的行为不像我预期的那样,我想为它编写一些单元测试。我可以编写单元测试来对单个标记进行词法分析:

runAlex "foo" alexMonadScan `shouldBe` Right TokenFoo

但我不知道如何测试字符串“foo bar”是否被词法化为[TokenFoo, TokenBar]

鉴于 Token 是我的 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 中定义

这是我找到的单子(monad)版本 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

关于unit-testing - 我如何对 Alex 代码进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31820534/

相关文章:

haskell - 为什么长度为具有 2 个元素的元组返回 1,并为具有更多元素的元组给出错误?

Haskell 处理 [IO 字符串]

unit-testing - 用于单元测试的 TestDrive.net 'Visual Studio add in' 的开源替代方案?

java - 如何模拟已在要测试的类的代码中实例化的对象并为其编写 stub ?

unix - 将 shell 的结果作为 Int 存储在变量中

haskell - 也许在一个单子(monad)中

haskell - 如何查找文件夹的所有子文件夹?

c# - 如何测试asp.net core内置的Ilogger

c# - 使用 EF Core 2.0 时的单元测试

list - 在 Haskell 中,[0.1..1] 返回 [0.1,1.1]。为什么?