roller-0.1.5: Roller/Parse.hs
module Roller.Parse (parse) where
import Roller.Types
import Text.Regex.Applicative
import Data.Char (isDigit, isSpace)
import Data.Word
naturalNumber :: RE Char Word8
naturalNumber = read <$> some (psym isDigit)
dieTerm :: RE Char DiceExpression
dieTerm = DieTerm <$> naturalNumber <* sym dieSymbol <*> naturalNumber
addedDieTerm :: RE Char DiceExpression
addedDieTerm = AddedDieTerm <$> (sym additionSymbol *> naturalNumber) <* sym dieSymbol <*> naturalNumber
subtractedDieTerm :: RE Char DiceExpression
subtractedDieTerm = SubtractedDieTerm <$> (sym subtractionSymbol *> naturalNumber) <* sym dieSymbol <*> naturalNumber
constantTerm :: RE Char DiceExpression
constantTerm = ConstantTerm <$> naturalNumber
addedConstantTerm :: RE Char DiceExpression
addedConstantTerm = AddedConstantTerm <$> (sym additionSymbol *> naturalNumber)
subtractedConstantTerm :: RE Char DiceExpression
subtractedConstantTerm = SubtractedConstantTerm <$> (sym subtractionSymbol *> naturalNumber)
diceExpression1 :: RE Char [DiceExpression]
diceExpression1 = (:) <$> term <*> many signedTerm where
term = dieTerm <|> constantTerm
signedTerm = signedDieTerm <|> signedConstantTerm
signedDieTerm = addedDieTerm <|> subtractedDieTerm
signedConstantTerm = addedConstantTerm <|> subtractedConstantTerm
parse :: String -> Maybe [DiceExpression]
parse x = filter (not . isSpace) x =~ diceExpression1