我正在用monad包装器用Alex编写lexer。它的表现并不像我预期的那样,我想为它编写一些单元测试。我可以通过执行以下操作来编写对单个令牌进行词法分析的单元测试:
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]
显然是把沿途看到的代币扔了。
我怎样才能做到这一点?