我正在使用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]
,显然丢失了它沿途看到的标记。
我该如何解决这个问题?