我正在使用 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/