49 lines
1.3 KiB
Haskell
49 lines
1.3 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
module Mima.Parse.FlagFile
|
|
( parseFlagFile
|
|
, readFlagFile
|
|
) where
|
|
|
|
import Control.Monad
|
|
import Data.Char
|
|
import qualified Data.Map as Map
|
|
import qualified Data.Set as Set
|
|
import qualified Data.Text as T
|
|
import Text.Megaparsec
|
|
|
|
import Mima.Flag
|
|
import Mima.Parse.Common
|
|
import Mima.Parse.Lexeme
|
|
import Mima.Parse.Weed
|
|
import Mima.Word
|
|
|
|
lAddress :: Parser MimaAddress
|
|
lAddress = lexeme fixedWidthHexAddress
|
|
|
|
lFlag :: Parser (Set.Set Char)
|
|
lFlag = lexeme $ label "alphanumeric character" $ Set.singleton <$> satisfy isAlphaNum
|
|
|
|
lFlags :: Parser (Set.Set Char)
|
|
lFlags = Set.unions <$> some lFlag
|
|
|
|
lAddressRange :: Parser AddressRange
|
|
lAddressRange = do
|
|
firstAddress <- lAddress
|
|
secondAddress <- (symbol "-" *> lAddress) <|> pure firstAddress
|
|
void $ symbol ":"
|
|
pure $ range firstAddress secondAddress
|
|
|
|
lLine :: Parser (AddressRange, Set.Set Char)
|
|
lLine = do
|
|
a <- lAddressRange
|
|
void $ symbol ":"
|
|
f <- lFlags
|
|
hidden lNewlines
|
|
pure (a, f)
|
|
|
|
parseFlagFile :: Parser AllFlags
|
|
parseFlagFile = space *> many lNewline *> (Map.fromList <$> many lLine) <* hidden eof
|
|
|
|
readFlagFile :: FilePath -> T.Text -> Either WeedErrorBundle AllFlags
|
|
readFlagFile filename input = parse parseFlagFile filename input
|