You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
742 B
41 lines
742 B
{-# LANGUAGE QuasiQuotes #-} |
|
module AltParsing where |
|
|
|
import Control.Applicative |
|
import Text.RawString.QQ |
|
import Text.Trifecta |
|
|
|
type NumberOrString = Either Integer String |
|
|
|
a :: String |
|
a = "blah" |
|
b :: String |
|
b = "123" |
|
c :: String |
|
c = "123blah789" |
|
|
|
eitherOr :: String |
|
eitherOr = [r| |
|
123 |
|
abc |
|
456 |
|
def |
|
|] |
|
|
|
parseNos :: Parser NumberOrString |
|
parseNos = do |
|
skipMany (oneOf "\n") |
|
v <- (Left <$> integer) <|> (Right <$> some letter) |
|
skipMany (oneOf "\n") |
|
return v |
|
|
|
main :: IO () |
|
main = do |
|
let p f i = parseString f mempty i |
|
print $ p (some letter) a |
|
print $ p integer b |
|
print $ p parseNos a |
|
print $ p parseNos b |
|
print $ p (many parseNos) c |
|
print $ p (some parseNos) c |
|
print $ p (some parseNos) eitherOr
|
|
|