-- | A DSL for building BNF grammars

module Hydra.Impl.Haskell.Dsl.Grammars where

import Hydra.Kernel
import Data.String(IsString(..))


instance IsString Pattern where fromString :: String -> Pattern
fromString = String -> Pattern
symbol

infixr 0 >:
(>:) :: String -> Pattern -> Pattern
String
l >: :: String -> Pattern -> Pattern
>: Pattern
p = LabeledPattern -> Pattern
PatternLabeled forall a b. (a -> b) -> a -> b
$ Label -> Pattern -> LabeledPattern
LabeledPattern (String -> Label
Label String
l) Pattern
p

alts :: [Pattern] -> Pattern
alts :: [Pattern] -> Pattern
alts = [Pattern] -> Pattern
PatternAlternatives

define :: String -> [Pattern] -> Production
define :: String -> [Pattern] -> Production
define String
s [Pattern]
pats = Symbol -> Pattern -> Production
Production (String -> Symbol
Symbol String
s) Pattern
pat
  where
    pat :: Pattern
pat = case [Pattern]
pats of
      [Pattern
p] -> Pattern
p
      [Pattern]
_ -> [Pattern] -> Pattern
alts [Pattern]
pats

ignored :: Pattern -> Pattern
ignored :: Pattern -> Pattern
ignored = Pattern -> Pattern
PatternIgnored

list :: [Pattern] -> Pattern
list :: [Pattern] -> Pattern
list = [Pattern] -> Pattern
PatternSequence

nil :: Pattern
nil :: Pattern
nil = Pattern
PatternNil

opt :: Pattern -> Pattern
opt :: Pattern -> Pattern
opt = Pattern -> Pattern
PatternOption

plus :: Pattern -> Pattern
plus :: Pattern -> Pattern
plus = Pattern -> Pattern
PatternPlus

regex :: String -> Pattern
regex :: String -> Pattern
regex = Regex -> Pattern
PatternRegex forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Regex
Regex

star :: Pattern -> Pattern
star :: Pattern -> Pattern
star = Pattern -> Pattern
PatternStar

symbol :: String -> Pattern
symbol :: String -> Pattern
symbol = Symbol -> Pattern
PatternNonterminal forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Symbol
Symbol

terminal :: String -> Pattern
terminal :: String -> Pattern
terminal = Constant -> Pattern
PatternConstant forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Constant
Constant