Cabal-2.0.0.2: Distribution/Lex.hs
-----------------------------------------------------------------------------
-- |
-- Module : Distribution.Lex
-- Copyright : Ben Gamari 2015-2019
--
-- Maintainer : cabal-devel@haskell.org
-- Portability : portable
--
-- This module contains a simple lexer supporting quoted strings
module Distribution.Lex (
tokenizeQuotedWords
) where
import Prelude ()
import Distribution.Compat.Prelude
import Distribution.Compat.DList
tokenizeQuotedWords :: String -> [String]
tokenizeQuotedWords = filter (not . null) . go False mempty
where
go :: Bool -- ^ in quoted region
-> DList Char -- ^ accumulator
-> String -- ^ string to be parsed
-> [String] -- ^ parse result
go _ accum []
| [] <- accum' = []
| otherwise = [accum']
where accum' = runDList accum
go False accum (c:cs)
| isSpace c = runDList accum : go False mempty cs
| c == '"' = go True accum cs
go True accum (c:cs)
| c == '"' = go False accum cs
go quoted accum (c:cs)
= go quoted (accum `mappend` singleton c) cs