Check delimiters by hand to keep accurate source pos

This commit is contained in:
Igor Ranieri 2025-09-21 12:34:30 +02:00
parent 7ef411b134
commit 4ef8d2c28c
2 changed files with 15 additions and 10 deletions

View file

@ -11,6 +11,7 @@ import Data.Char (isAlphaNum, isPrint)
import Data.Functor (($>))
import Data.Text (Text)
import Data.Text qualified as Text
import Debug.Trace (traceM)
import GHC.Stack (HasCallStack)
import ParserMonad (Parser, initialParserState)
import Text.Parsec
@ -94,12 +95,16 @@ textElement =
delimitedMaybe :: Parser a -> Parser a -> Token -> Maybe Token -> Parser [LocatedToken]
delimitedMaybe op cl ot ct = do
pos <- getPosition
(text, content) <- match $ between op cl any'
let openTok :: LocatedToken = (setSourceColumn pos 1, ot)
res :: LocatedToken = (setSourceColumn pos 2, Token content)
openPos <- getPosition
void op -- opening
tokenPos <- getPosition
content <- any'
closePos <- getPosition
void cl
let openTok :: LocatedToken = (openPos, ot)
res :: LocatedToken = (tokenPos, Token content)
closeToks :: [LocatedToken] = case ct of
Just close -> [(setSourceColumn pos (Text.length text), close)]
Just close -> [(closePos, close)]
Nothing -> []
pure $ [openTok, res] <> closeToks