{-| Module : PP.Parser Description : Common behavior for defined parsers Copyright : (c) 2017 Patrick Champion License : see LICENSE file Maintainer : chlablak@gmail.com Stability : provisional Portability : portable -} module PP.Parser ( LrParser(..) ) where import PP.Builder (LrTable) import PP.Lexer (OToken (..)) -- |Type class for LR parser class LrParser config where -- |Put the input into the configuration config :: LrTable -> [OToken] -> config -- |Parse one iteration only next :: LrTable -> config -> config -- |Check if there is still an iteration hasNext :: LrTable -> config -> Bool -- |Parse all iterations parse :: LrTable -> config -> config parse t c | hasNext t c = parse t $ next t c | otherwise = c -- |Parse all iterations and keep all configurations (in reverse order) parse' :: LrTable -> config -> [config] parse' t c = parse'' t [c] where parse'' t acc@(c:_) | hasNext t c = parse'' t $ next t c : acc | otherwise = acc