Grempa 0.1.1 → 0.1.2
raw patch · 2 files changed
+27/−1 lines, 2 files
Files
- Data/Parser/Grempa/Grammar/Levels.hs +26/−0
- Grempa.cabal +1/−1
Data/Parser/Grempa/Grammar/Levels.hs view
@@ -30,9 +30,35 @@ type RStateT s m a = ReverseT (StateT s m) a +-- | Start a levels block. Usage:+--+-- > expr <- levels $ do+-- > rec+-- > e <- lrule [ Plus <@> e <# '+' <#> t ]+-- > t <- lrule [ Times <@> t <# '*' <#> f ]+-- > f <- lrule [ Var <@ 'x'+-- > , id <@ '(' <#> e <# ')']+-- > return e+--+-- is equivalent to+--+-- > e <- rule [ Plus <@> e <# '+' <#> t +-- > , id <@> t+-- > ]+-- > t <- rule [ Times <@> t <# '*' <#> f +-- > , id <@> f+-- > ]+-- > f <- rule [ Var <@ 'x'+-- > , id <@ '(' <#> e <# ')'+-- > ]+--+-- Put simply, every lrule save for the last one gets an additional identity+-- production pointing to the next lrule. This is a common pattern when+-- creating grammars with precedence levels. levels :: Monad m => RStateT (Maybe a) m r -> m r levels = flip evalStateT Nothing . runReverseT +-- | A rule in a levels block lrule :: (Typeable a, Typeable t) => Rule t a -> RStateT (Maybe (RId t a)) (GrammarState t) (RId t a)
Grempa.cabal view
@@ -1,5 +1,5 @@ Name: Grempa-Version: 0.1.1+Version: 0.1.2 Synopsis: Embedded grammar DSL and LALR parser generator Description: A library for expressing programming language grammars in a form similar