úÎ"v §#      !"Safe/Two provided symbols besides user defined data.represents the starting symbol.represents the null symbol.represents a terminal symbol.!represents a non-terminal symbol.3represents an undetermined symbol, used internally.'non-terms -> lhs -> rhs -> product rule non-terms   None-CNUse  iff the left side is the I symbol and the first symbol on the right side is an user-defined symbol.1Only one symbol is allowed on the left hand side. ]table :: [ProductRule MySym] table = productRules $ do Start ---> A & B ... ...Use X iff both the left side and the first symbol on the right side are user-defined symbols.3| Only one symbol is allowed on the left hand side.| Use ) to concatenate two user-defined symbols. Štable :: [ProductRule MySym] table = productRules $ do Start ---> ... ... ; A --> C' |/ Null ...Use ) to concatenate two user-defined symbols. ^table :: [ProductRule MySym] table = productRules $ do Start >>> Null & C' |> ...Use } to represent "or" when the left hand side can produce two different expressions, and the right side in a user-defined type. htable :: [ProductRule MySym] table = productRules $ do Start ---> ... ... |> C'Use  iff the right hand side is the  symbol. ltable :: [ProductRule MySym] table = productRules $ do Start ---> C' |/ Null |> ...Use  iff the left side is + and the first symbol on the right side is . ftable :: [ProductRule MySym] table = productRules $ do Start >>> Null |> C' ...        None-CN!CCollect the defined syntax and produces a list of production rules.  !"  !  !"  !" See LICENSEylilarry@gmail.com ExperimentalNon-portable (GHC extensions)None ! !#      !"#$%&parse_89hm9rx2XOf6ldoCg2jx1bParser.ProductRule.Internal!Parser.ProductRule.Internal.Maker#Parser.ProductRule.Internal.ManagerParser.ProductRule ProductRuleSymbolStartNullTNTUDrulesetT FromMaker fromMakerMakerMaker'unMakermaker--->-->&|>|/>>>$fFromMakerMaker'ManagerManager' unManager getMakers addMakersempty singletongetRulesgetNTs productRules$fFromMakerManager'