module Language.Symantic.Grammar.EBNF where
import Control.Applicative (Applicative(..))
-import Data.Semigroup
+import Data.Eq (Eq)
+import Data.Function (($), (.), id)
+import Data.Functor (Functor(..))
+import Data.Semigroup (Semigroup(..))
import Data.Text (Text)
+import Text.Show (Show(..))
import qualified Data.Text as Text
import Language.Symantic.Grammar.Meta
-- | 'EBNF' which adds an argument to be applied.
ebnf_arg :: EBNF a -> EBNF b -> EBNF ()
-ebnf_arg (EBNF a) (EBNF b) = EBNF $ \bo po -> parenInfix po op $
+ebnf_arg (EBNF a) (EBNF b) = EBNF $ \bo po -> pairIfNeeded pairParen po op $
a bo (op, SideL) <> " " <> b bo (op, SideR)
where op = infixL 11
infixl 5 `ebnf_arg`
fmap _f (EBNF x) = EBNF x
instance Applicative EBNF where
pure _ = ebnf_const $ "\"\""
- EBNF f <*> EBNF x = EBNF $ \bo po -> parenInfix po op $
+ EBNF f <*> EBNF x = EBNF $ \bo po -> pairIfNeeded pairParen po op $
f bo (op, SideL) <> ", " <> x bo (op, SideR)
where op = infixB SideL 10
instance Gram_Rule EBNF where