How can I unit test Alex code?

I'm writing a lexer in Alex with the monad wrapper. It's not behaving as I expect, and I would like to write some unit tests for it. I can write unit tests for lexing a single token by doing:

runAlex "foo" alexMonadScan `shouldBe` Right TokenFoo

but I don't know how to test that the string "foo bar" gets lexed to [TokenFoo, TokenBar] .

Given that Token is my token type, I'd need a function like runAlex that has the type String -> Alex [Token] -> Either String [Token] , but I don't know how to transform alexMonadScan so that it has the type Alex [Token] rather than Alex Token .

I tried

runAlex "foo bar" (liftM (:[]) alexMonadScan) `shouldBe` [TokenFoo, TokenBar]

which seems to have the right type, but it returns Right [TokenEOF] , apparently dropping the tokens it saw along the way.

How can I achieve this?


There is a function alexScanTokens :: String -> [token] which you can use.

It's defined in the file templates/wrappers.hs

Here's a monadic version I found 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
链接地址: http://www.djcxy.com/p/65638.html

上一篇: 什么原因导致快乐抛出一个解析错误?

下一篇: 我如何单元测试Alex代码?