我如何单元测试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
定义
这里是我在这里找到的一个monadic版本:
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
链接地址: http://www.djcxy.com/p/65637.html