Skip to content

Instantly share code, notes, and snippets.

@Lifelovinglight
Last active May 21, 2018 07:14
Show Gist options
  • Save Lifelovinglight/05868774f0db6d49cdf99be36dfe9da1 to your computer and use it in GitHub Desktop.
Save Lifelovinglight/05868774f0db6d49cdf99be36dfe9da1 to your computer and use it in GitHub Desktop.
left-recursive expression reduction example
import Text.Parsec
data Term = Plus Term Term
| Minus Term Term
| Div Term Term
| Mult Term Term
| Number Integer
deriving (Show)
type TermParser a = Parsec String () a
opParser :: TermParser (Term -> Term -> Term)
opParser = choice [ char '+' >> return Plus
, char '-' >> return Minus
, char '/' >> return Div
, char '*' >> return Mult ]
numberParser :: TermParser Term
numberParser = Number . (read :: String -> Integer) <$> many1 digit
termParser :: TermParser Term
termParser = chainl1 numberParser opParser
-- > runParser termParser () "" "231+4321*434"
-- Right (Mult (Plus (Number 231) (Number 4321)) (Number 434))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment