import qualified Text.Megaparsec as P
import Language.TCT.Token
-import Language.TCT.Elem
+import Language.TCT.Elem -- hiding (dbg)
import Language.TCT.Read.Elem -- hiding (pdbg)
--- pdbg m p = P.dbg m p
+{-
+import Debug.Trace (trace)
+dbg m x = trace (m <> ": " <> show x) x
+pdbg m p = P.dbg m p
+-}
textOf :: Buildable a => a -> Text
textOf = TL.toStrict . Builder.toLazyText . build
Just i -> Tokens $ TokenTag tag <| TokenPlain t' <| ts
where (tag,t') = Text.splitAt i t
Nothing -> Tokens $ TokenTag t <| ts
- _ -> tokens [TokenPlain $ fst $ pairBorders p mempty] <> tn <> acc
+ _ -> tokens [TokenPlain $ fst $ pairBorders p $ tokens [TokenPlain ""]] <> tn <> acc
where
isTagChar c =
Char.isAlphaNum c ||
p_PairCloseWhite :: Parser e s [Lexeme]
p_PairCloseWhite = pdbg "PairCloseWhite" $
(\c b -> mconcat c <> b)
- <$> P.some (P.try p_PairClose <|> pure . LexemePunctOrSym <$> p_PunctOrSym)
+ <$> P.some (
+ P.try p_ElemOpen <|>
+ P.try p_ElemClose <|>
+ P.try p_PairClose <|>
+ pure . LexemePunctOrSym <$> p_PunctOrSym
+ )
<*> ((pure <$> p_White) <|> P.eof $> [])
p_PairWhiteOpen :: Bool -> Parser e s [Lexeme]
p_PairWhiteOpen isBOF = pdbg "PairWhiteOpen" $
(\b o -> b <> mconcat o)
<$> (if isBOF then return [] else pure <$> p_White)
- <*> P.some (P.try p_PairOpen <|> pure . LexemePunctOrSym <$> p_PunctOrSym)
+ <*> P.some (
+ P.try p_ElemOpen <|>
+ P.try p_ElemClose <|>
+ P.try p_PairOpen <|>
+ pure . LexemePunctOrSym <$> p_PunctOrSym
+ )
p_PairCloseBorder :: Parser e s [Lexeme]
p_PairCloseBorder = pdbg "PairCloseBorder" $
, P.try p_ElemClose
, do
c <- p_PunctOrSym
- case l_PairClose c of
+ case l_PairOpen c <|> l_PairClose c of
Just l -> return [l]
- Nothing ->
- case l_PairOpenAndClose LexemePairOpen c <|> l_PairOpen c of
- Nothing -> return [LexemePunctOrSym c]
- _ -> fail ""
+ Nothing -> fail ""
])
p1 =
(\c b -> mconcat c <> [LexemePunctOrSym b])
<*> P.satisfy Char.isPrint
p_ElemSingle :: Parser e s [Lexeme]
-p_ElemSingle = pdbg "ElemOpen" $
+p_ElemSingle = pdbg "ElemSingle" $
(\e as ->
[ LexemePairOpen $ PairElem e as
- , LexemeToken $ Tokens mempty
- -- NOTE: encode that it's the same Elem for open and close
+ , LexemeToken $ mempty
, LexemePairClose $ PairElem e [] ])
<$ P.char '<'
<*> p_Word
(\e as oc ->
case oc of
True -> [ LexemePairOpen $ PairElem e as
- , LexemeToken $ Tokens mempty
+ , LexemeToken $ mempty
, LexemePairClose $ PairElem e [] ]
- False -> [LexemePairOpen $ PairElem e as])
+ False -> [ LexemePairOpen $ PairElem e as
+ , LexemeToken $ tokens [TokenPlain ""]
+ ])
<$ P.char '<'
<*> p_Word
<*> p_Attrs