【问题标题】:How can I unit test Alex code?如何对 Alex 代码进行单元测试?
【发布时间】:2015-08-04 22:35:23
【问题描述】:

我正在用 monad 包装器在 Alex 中编写一个词法分析器。它的行为不像我预期的那样,我想为它写一些单元测试。我可以编写单元测试来对单个标记进行词法分析:

runAlex "foo" alexMonadScan `shouldBe` Right TokenFoo

但我不知道如何测试字符串“foo bar”是否被解析为[TokenFoo, TokenBar]

鉴于Token 是我的令牌类型,我需要一个类似runAlex 的函数,其类型为String -> Alex [Token] -> Either String [Token],但我不知道如何转换alexMonadScan 使其具有@ 类型987654327@ 而不是Alex Token

我试过了

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

这似乎有正确的类型,但它返回Right [TokenEOF],显然丢弃了它沿途看到的令牌。

我怎样才能做到这一点?

【问题讨论】:

  • 请不要对我进行单元测试,这让我感到不舒服。
  • @AlexM。为什么?你有什么要隐藏的吗?
  • @ʎǝɹɟɟɟǝſ 我-不是那样的。

标签: unit-testing haskell monads lexer


【解决方案1】:

有一个函数alexScanTokens :: String -> [token]可以使用。

在文件templates/wrappers.hs中定义

这是我找到的一元版本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

【讨论】:

  • 这适用于 monad 包装器吗?我的印象是它只适用于基本包装器。当我尝试使用它时,我收到了Not in scope: alexScanTokens
  • 答案已更新。要在范围内获取alexScanTokens,您需要定义ALEX_BASICALEX_BASIC_BYTESTRING 或另一个ALEX_... 符号之一。见here
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多