diff --git a/cabal.project b/cabal.project index be54576..a237a6b 100644 --- a/cabal.project +++ b/cabal.project @@ -5,4 +5,4 @@ packages: source-repository-package type: git location: https://git.rhiannon.website/rhi/svg-builder - tag: 1cbcd594d3009f9fd71f253b52ac82673bf5482e + tag: 39bb6a4e04ec2caccc23576b062ebfa0566bfb96 diff --git a/laantas-script/laantas-script.cabal b/laantas-script/laantas-script.cabal index 433b83d..b150042 100644 --- a/laantas-script/laantas-script.cabal +++ b/laantas-script/laantas-script.cabal @@ -30,12 +30,12 @@ executable laantas-script RecordWildCards, ViewPatterns build-depends: - base >= 4.14.0.0 && < 4.17, + base >= 4.14.0.0 && < 4.20, containers ^>= 0.6.2.1, mtl ^>= 2.2.2, svg-builder ^>= 0.1.1, optparse-applicative ^>= 0.16.0.0, - text ^>= 1.2.3.2, - megaparsec ^>= 9.0.1 + text ^>= 2.1, + megaparsec ^>= 9.6.1 ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N diff --git a/langfilter/Ebnf.hs b/langfilter/Ebnf.hs index 41ed72e..5a83209 100644 --- a/langfilter/Ebnf.hs +++ b/langfilter/Ebnf.hs @@ -10,21 +10,23 @@ import Text.Pandoc.Definition import Data.Text (Text) import qualified Data.Text as Text import Data.Void +import Data.List.NonEmpty (NonEmpty (..)) +import qualified Data.List.NonEmpty as NonEmpty data Rule = Rule Text Def | RCom Text -- ^ @(* comment *)@ deriving (Eq, Show) data Def = - N Text -- ^ @nonterminal@ - | T Text -- ^ @\'terminal\'@ or @\"terminal\"@ - | S Text -- ^ @?special?@ - | Or [Def] -- ^ choice @a | b | c@ - | Seq [Def] -- ^ sequence @a, b, c@ - | Sub Def Def -- ^ difference @a - b@ - | Opt Def -- ^ opt @[a]@ - | Many Def -- ^ repetition @{a}@ - | Com Text -- ^ comment + N Text -- ^ @nonterminal@ + | T Text -- ^ @\'terminal\'@ or @\"terminal\"@ + | S Text -- ^ @?special?@ + | Or (NonEmpty Def) -- ^ choice @a | b | c@ + | Seq (NonEmpty Def) -- ^ sequence @a, b, c@ + | Sub Def Def -- ^ difference @a - b@ + | Opt Def -- ^ opt @[a]@ + | Many Def -- ^ repetition @{a}@ + | Com Text -- ^ comment deriving (Eq, Show) @@ -51,9 +53,9 @@ render1 (RCom txt) = render1 (Rule name def) = row' [span "ebnf-nt" name] "=" d : map (row' [] "|") ds where - d:ds = splitOrs def + d :| ds = splitOrs def splitOrs (Or ds) = ds - splitOrs d = [d] + splitOrs d = NonEmpty.singleton d row' c1 p d = Row mempty [cell c1, cell [punc p], cell (renderDef d)] cell is = Cell mempty AlignDefault (RowSpan 1) (ColSpan 1) [Plain is] @@ -76,9 +78,9 @@ renderDefAt p = \case T txt -> [span "ebnf-t" txt] S txt -> [span "ebnf-s" txt] Or ds -> renderParens (p > OR) $ - intercalate [Space, punc "|", Space] $ renderDefAt OR <$> ds + intercalate [Space, punc "|", Space] $ renderDefAt OR <$> NonEmpty.toList ds Seq ds -> renderParens (p > SEQ) $ - intercalate [punc ",", Space] $ renderDefAt SEQ <$> ds + intercalate [punc ",", Space] $ renderDefAt SEQ <$> NonEmpty.toList ds Sub d e -> renderParens (p >= SUB) $ renderDefAt SUB d <> [Space, span "ebnf-sub" "−", Space] <> @@ -111,10 +113,13 @@ def :: P Def def = ors ors :: P Def -ors = list Or <$> seqs `sepBy1` (sym "|") +ors = list1 Or <$> seqs `sepBy1'` (sym "|") seqs :: P Def -seqs = list Seq <$> sub `sepBy1` (sym ",") +seqs = list1 Seq <$> sub `sepBy1'` (sym ",") + +sepBy1' :: P a -> P z -> P (NonEmpty a) +sepBy1' a b = NonEmpty.fromList <$> sepBy1 a b sub :: P Def sub = do @@ -154,9 +159,9 @@ comment = do try (string_ "(*"); go ["(*"] 1 where bracketed :: (Def -> a) -> Char -> Char -> P a bracketed f o c = f <$> between (char' o) (char' c) def -list :: ([a] -> a) -> [a] -> a -list _ [x] = x -list f xs = f xs +list1 :: (NonEmpty a -> a) -> NonEmpty a -> a +list1 _ (x :| []) = x +list1 f xs = f xs sym :: Text -> P Text diff --git a/langfilter/langfilter.cabal b/langfilter/langfilter.cabal index 70ac7c4..f13767c 100644 --- a/langfilter/langfilter.cabal +++ b/langfilter/langfilter.cabal @@ -33,11 +33,11 @@ executable langfilter RecordWildCards, ViewPatterns build-depends: - base >= 4.14.0.0 && < 4.17, + base >= 4.14.0.0 && < 4.20, containers ^>= 0.6.2.1, filepath ^>= 1.4.2.1, - megaparsec ^>= 9.0.1, + megaparsec ^>= 9.6.1, process ^>= 1.6.11.0, pandoc-types ^>= 1.23, - text, + text ^>= 2.1, pretty-show ^>= 1.10