我正在用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
这是我在这里找到的单声道版本:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句