module Data.Parser.Grempa.Parser.SLR
( Item(..)
) where
import Data.Set(Set)
import qualified Data.Set as S
import Data.Parser.Grempa.Aux.Aux
import Data.Parser.Grempa.Parser.Item
import Data.Parser.Grempa.Grammar.Token
import Data.Parser.Grempa.Grammar.Untyped
data Item s =
Item { itemRId :: RId s
, itemProd :: Int
, itemPos :: Int
}
deriving (Eq, Ord)
instance Show (Item s) where
show (Item r pr po) = "It(" ++ show r ++
"," ++ show pr ++
"," ++ show po ++ ")"
instance Token s => It Item s where
itRId = itemRId
itProd = itemProd
getItPos = itemPos
setItPos i p = i {itemPos = p}
closure = closureLR0
startItem rid = Item rid 0 0
closureLR0 :: Token s => Set (Item s) -> Set (Item s)
closureLR0 = recTraverseG closure'
where
closure' is = (is `S.union` res, res)
where res = S.unions $ map closureI (S.toList is)
closureI i = case nextSymbol i of
Tok (SRule rid) -> firstItems rid
_ -> S.empty
firstItems :: RId s -> Set (Item s)
firstItems rid@(RId _ prods) = S.fromList
$ map (\p -> Item rid p 0) [0..length prods 1]