parsley-1.0.0.1: benchmarks/BrainfuckBench/Parsley/Parser.hs
{-# OPTIONS_GHC -fplugin=Parsley.OverloadedQuotesPlugin #-}
{-# LANGUAGE TemplateHaskellQuotes #-}
{-# LANGUAGE DeriveLift #-}
{-# LANGUAGE StandaloneDeriving #-}
module BrainfuckBench.Parsley.Parser where
import Prelude hiding (fmap, pure, (<*), (*>), (<*>), (<$>), (<$), pred)
import BrainfuckBench.Shared
import Parsley
import Parsley.Combinator (noneOf, eof)
import Parsley.Fold (skipMany)
--import Parsley.Garnish
import Language.Haskell.TH.Syntax (Lift(..))
deriving instance Lift BrainFuckOp
brainfuck :: Parser [BrainFuckOp]
brainfuck = whitespace *> bf <* eof
where
whitespace = skipMany (noneOf "<>+-[],.")
lexeme p = p <* whitespace
{-bf = many ( lexeme ((token ">" $> code RightPointer)
<|> (token "<" $> code LeftPointer)
<|> (token "+" $> code Increment)
<|> (token "-" $> code Decrement)
<|> (token "." $> code Output)
<|> (token "," $> code Input)
<|> (between (lexeme (token "[")) (token "]") (code Loop <$> bf))))-}
bf = many (lexeme (match "><+-.,[" (lookAhead item) op empty))
op '>' = item $> [|RightPointer|]
op '<' = item $> [|LeftPointer|]
op '+' = item $> [|Increment|]
op '-' = item $> [|Decrement|]
op '.' = item $> [|Output|]
op ',' = item $> [|Input|]
op '[' = between (lexeme item) (try (char ']')) ([|Loop|] <$> bf)