Last active
May 21, 2018 07:14
-
-
Save Lifelovinglight/05868774f0db6d49cdf99be36dfe9da1 to your computer and use it in GitHub Desktop.
left-recursive expression reduction example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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