|
1 |
| -{-# LANGUAGE OverloadedStrings #-} |
2 | 1 | {-# LANGUAGE DeriveTraversable #-}
|
| 2 | +{-# LANGUAGE OverloadedStrings #-} |
| 3 | +{-# LANGUAGE RecordWildCards #-} |
3 | 4 |
|
4 | 5 | module ZM.Parser.Bracket (
|
5 | 6 | Bracket (..),
|
6 | 7 | bracket,
|
| 8 | + prettyBracket, |
7 | 9 | ) where
|
8 | 10 |
|
9 | 11 | import Data.Maybe (fromMaybe)
|
10 | 12 | import Data.Text (Text)
|
| 13 | +import Prettyprinter |
| 14 | +import qualified Prettyprinter as PP |
11 | 15 | import Text.Megaparsec
|
12 | 16 | import Text.Megaparsec.Char
|
13 | 17 | import ZM.Parser.Lexer
|
| 18 | +import ZM.Parser.Literal |
14 | 19 | import ZM.Parser.Types
|
15 |
| -import ZM.Pretty |
16 |
| -import Control.Monad (void) |
17 |
| -import Text.PrettyPrint(vcat) |
| 20 | +import ZM.Parser.Util (testParse) |
| 21 | + |
| 22 | +-- import Text.PrettyPrint (vcat) |
18 | 23 |
|
19 | 24 | {- List of values between brackets, space separated, with an optional operand/modifier
|
20 | 25 | >>> import ZM.Parser.Lexer
|
@@ -77,47 +82,111 @@ Just (Bracket {open = '[', close = ']', op = Nothing, values = [1,2]})
|
77 | 82 | >>> p "[ 1\n\n 2\n\n] "
|
78 | 83 | Just (Bracket {open = '[', close = ']', op = Nothing, values = [1,2]})
|
79 | 84 | -}
|
80 |
| --- generate test cases |
| 85 | +-- generate test cases |
81 | 86 | -- gen = [ T.concat ["[","]"] | n<-[0..2] ,l <- [0..2],sp <- T.take n (T.replicate " ")
|
82 | 87 |
|
83 | 88 | bracket :: Parser e -> Parser (Bracket e)
|
84 | 89 | bracket pe = lexeme $ do
|
85 |
| - (o, c) <- choice (map (\oc@(o, _) -> oc <$ char o) brackets) |
| 90 | + (o, c) <- choice (map (\oc@(o, _) -> oc <$ char o) bracketsOpenClose) |
86 | 91 | msym <- optional sym
|
87 | 92 | _ <- optional wsn
|
88 |
| - --vs <- many (sepElem pe) |
| 93 | + -- vs <- many (sepElem pe) |
89 | 94 | vs <- pe `endBy` elemSep
|
90 | 95 | -- _ <- optional wsn
|
91 | 96 | _ <- maybe (string "") string msym
|
92 | 97 | _ <- char c
|
93 | 98 | return $ Bracket o c msym vs
|
94 | 99 |
|
95 |
| -sepElem pe = choice [ |
96 |
| - pe |
97 |
| - , elemSep *> pe |
98 |
| - ] |
| 100 | +sepElem pe = |
| 101 | + choice |
| 102 | + [ pe |
| 103 | + , elemSep *> pe |
| 104 | + ] |
99 | 105 |
|
100 |
| -elemSep = choice [ |
101 |
| - --void $ symbol "," -- This will be parser by 'expr' |
102 |
| - wsn |
103 |
| - ,pure () |
104 |
| - ] |
| 106 | +elemSep = |
| 107 | + choice |
| 108 | + [ -- void $ symbol "," -- This will be parser by 'expr' |
| 109 | + wsn |
| 110 | + , pure () |
| 111 | + ] |
105 | 112 |
|
106 |
| -brackets :: [(Char, Char)] |
107 |
| -brackets = [('{', '}'), ('[', ']')] -- ('<','>'),('«','»')] |
| 113 | +bracketsOpenClose :: [(Char, Char)] |
| 114 | +bracketsOpenClose = [('{', '}'), ('[', ']')] -- ('<','>'),('«','»')] |
108 | 115 |
|
109 | 116 | data Bracket e = Bracket
|
110 | 117 | { open, close :: Char
|
111 | 118 | , op :: Maybe Text
|
112 | 119 | , values :: [e]
|
113 | 120 | }
|
114 |
| - deriving (Show, Eq, Ord,Functor) |
| 121 | + deriving (Show, Eq, Ord, Functor) |
115 | 122 |
|
116 | 123 | {-
|
117 |
| ->>> prettyShow <$> parseMaybe (bracket signedInt) "{%%11\n 22%%}" |
118 |
| -Just "{%%11\n 22%%}" |
| 124 | +>>> p = either id (show . pretty) . testParse (bracket charLiteral) |
| 125 | +
|
| 126 | +>>> error $ p "{}" |
| 127 | +{ |
| 128 | +} |
| 129 | +
|
| 130 | +>>> error $ p "{%% %%}" |
| 131 | +{%% |
| 132 | +%%} |
| 133 | +
|
| 134 | +>>> error $ p "{%% ?a ?b %%}" |
| 135 | +{%% |
| 136 | + a |
| 137 | + b |
| 138 | +%%} |
119 | 139 | -}
|
120 | 140 | instance (Pretty e) => Pretty (Bracket e) where
|
121 |
| - pPrint (Bracket open close mop vs) = |
122 |
| - let op = txt . fromMaybe "" $ mop |
123 |
| - in chr open <> op <> vcat (map pPrint vs) <> op <> chr close |
| 141 | + pretty = prettyBracket pretty |
| 142 | + |
| 143 | +-- pretty (Bracket{..}) = |
| 144 | +-- let sop = pretty . fromMaybe "" $ op |
| 145 | +-- in pretty open |
| 146 | +-- <> sop |
| 147 | +-- <> column (\l -> let n = l + 1 in hardline <> indent n (vcat (map pretty values)) <> hardline) |
| 148 | +-- <> hardlinesop |
| 149 | +-- <> pretty close |
| 150 | + |
| 151 | +-- ?TODO: add compact single line form {1 2 3} |
| 152 | +prettyBracket :: (a -> Doc ann) -> Bracket a -> Doc ann |
| 153 | +prettyBracket prettyE (Bracket{..}) = |
| 154 | + let sop = pretty . fromMaybe "" $ op |
| 155 | + beg = pretty open <> sop |
| 156 | + end = sop <> pretty close |
| 157 | + in align |
| 158 | + ( beg |
| 159 | + <> PP.space |
| 160 | + <> PP.space |
| 161 | + <> align (foldMap (\e -> hardline <> prettyE e) values) |
| 162 | + <> hardline |
| 163 | + <> end |
| 164 | + ) |
| 165 | + |
| 166 | +-- prettyBracket prettyE (Bracket{..}) = |
| 167 | +-- let sop = pretty . fromMaybe "" $ op |
| 168 | +-- in column |
| 169 | +-- ( \s -> |
| 170 | +-- pretty open |
| 171 | +-- <> sop |
| 172 | +-- <> column |
| 173 | +-- ( \l -> |
| 174 | +-- hardline |
| 175 | +-- <> indent (l + 2) (align (vsep (map prettyE values))) |
| 176 | +-- <> hardline |
| 177 | +-- ) |
| 178 | +-- <> indent s (sop <> pretty close) |
| 179 | +-- ) |
| 180 | + |
| 181 | +-- <> hardline |
| 182 | +-- <> PP.space |
| 183 | +-- <> PP.space |
| 184 | +-- <> align (vsep (map prettyE values)) |
| 185 | +-- <> hardline |
| 186 | +-- <> sop |
| 187 | +-- <> pretty close |
| 188 | + |
| 189 | +-- instance (Pretty e) => Pretty (Bracket e) where |
| 190 | +-- pPrint (Bracket open close mop vs) = |
| 191 | +-- let op = txt . fromMaybe "" $ mop |
| 192 | +-- in chr open <> op <> vcat (map pPrint vs) <> op <> chr close |
0 commit comments