2015-08-04 4 views
3

Я пишу лексер в Алеке с обложкой монады. Это не так, как я ожидаю, и я хотел бы написать для него некоторые модульные тесты. Я могу писать тесты для Lexing один маркер, выполнив:Как я могу проверить код Alex?

runAlex "foo" alexMonadScan `shouldBe` Right TokenFoo 

, но я не знаю, как проверить, что строка «Foo бар» получает lexed к [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], видимо, сбросив жетоны он видел по пути.

Как я могу это достичь?

+3

Пожалуйста, не блок испытай меня, это заставляет меня чувствовать себя некомфортно. –

+1

@ AlexM. Зачем? У вас есть что скрывать? – Shoe

+0

@ ʎǝɹɟɟɟǝs I-это не так. –

ответ

4

Существует функция 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 
+0

Это работает с оболочкой монады? У меня сложилось впечатление, что он работал только с основной оберткой. Я получаю «Не в области: alexScanTokens», когда я пытаюсь его использовать. –

+1

Отвечено обновлено. Чтобы получить «alexScanTokens» в области видимости, вам нужно определить один из символов «ALEX_BASIC», «ALEX_BASIC_BYTESTRING» или другого символа «ALEX _...». См. [Здесь] (https://github.com/simonmar/alex/blob/master/templates/wrappers.hs#L376) – ErikR

+0

Отлично, спасибо. –