Skip to content

Instantly share code, notes, and snippets.

@yytyd
Last active November 2, 2019 09:19
Show Gist options
  • Save yytyd/f21a636588b1f630cdd2207d9d4340b5 to your computer and use it in GitHub Desktop.
Save yytyd/f21a636588b1f630cdd2207d9d4340b5 to your computer and use it in GitHub Desktop.
Packrat Parsing
data Result v = Parsed v Derivs
| NoParse
data Derivs = Derivs {
dvAdditive :: Result Int,
dvMultitive :: Result Int,
dvPrimary :: Result Int,
dvDecimal :: Result Int,
dvChar :: Result Char}
parse :: String -> Derivs
parse s = d where
d = Derivs add mult prim dec chr
add = pAdditive d
mult = pMultitive d
prim = pPrimary d
dec = pDecimal d
chr = case s of
(c:s') -> Parsed c (parse s')
[] -> NoParse
pAdditive :: Derivs -> Result Int
pAdditive d = alt1 where
alt1 = case dvMultitive d of
Parsed vleft d' ->
case dvChar d' of
Parsed '+' d'' ->
case dvAdditive d'' of
Parsed vright d''' ->
Parsed (vleft + vright) d'''
_ -> alt2
_ -> alt2
_ -> alt2
alt2 = dvMultitive d
pMultitive :: Derivs -> Result Int
pPrimary :: Derivs -> Result Int
pDecimal :: Derivs -> Result Int
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment