mirror of
https://github.com/mrkkrp/megaparsec.git
synced 2024-12-30 03:35:06 +03:00
95 lines
2.9 KiB
Haskell
95 lines
2.9 KiB
Haskell
|
-----------------------------------------------------------------------------
|
||
|
-- |
|
||
|
-- Module : Text.Parsec.Pos
|
||
|
-- Copyright : (c) Daan Leijen 1999-2001, (c) Paolo Martini 2007
|
||
|
-- License : BSD-style (see the LICENSE file)
|
||
|
--
|
||
|
-- Maintainer : paolo@nemail.it
|
||
|
-- Stability : provisional
|
||
|
-- Portability : portable
|
||
|
--
|
||
|
-- Textual source positions.
|
||
|
--
|
||
|
-----------------------------------------------------------------------------
|
||
|
|
||
|
module Text.Parsec.Pos
|
||
|
( SourceName, Line, Column
|
||
|
, SourcePos
|
||
|
, sourceLine, sourceColumn, sourceName
|
||
|
, incSourceLine, incSourceColumn
|
||
|
, setSourceLine, setSourceColumn, setSourceName
|
||
|
, newPos, initialPos
|
||
|
, updatePosChar, updatePosString
|
||
|
) where
|
||
|
|
||
|
-- | Source positions: a file name, a line and a column
|
||
|
-- upper left is (1,1)
|
||
|
|
||
|
type SourceName = String
|
||
|
type Line = Int
|
||
|
type Column = Int
|
||
|
|
||
|
data SourcePos = SourcePos SourceName !Line !Column
|
||
|
deriving ( Eq, Ord )
|
||
|
|
||
|
newPos :: SourceName -> Line -> Column -> SourcePos
|
||
|
newPos sourceName line column
|
||
|
= SourcePos sourceName line column
|
||
|
|
||
|
initialPos :: SourceName -> SourcePos
|
||
|
initialPos sourceName
|
||
|
= newPos sourceName 1 1
|
||
|
|
||
|
sourceName :: SourcePos -> SourceName
|
||
|
sourceName (SourcePos name line column) = name
|
||
|
|
||
|
sourceLine :: SourcePos -> Line
|
||
|
sourceLine (SourcePos name line column) = line
|
||
|
|
||
|
sourceColumn :: SourcePos -> Column
|
||
|
sourceColumn (SourcePos name line column) = column
|
||
|
|
||
|
incSourceLine :: SourcePos -> Line -> SourcePos
|
||
|
incSourceLine (SourcePos name line column) n = SourcePos name (line+n) column
|
||
|
|
||
|
incSourceColumn :: SourcePos -> Column -> SourcePos
|
||
|
incSourceColumn (SourcePos name line column) n = SourcePos name line (column+n)
|
||
|
|
||
|
setSourceName :: SourcePos -> SourceName -> SourcePos
|
||
|
setSourceName (SourcePos name line column) n = SourcePos n line column
|
||
|
|
||
|
setSourceLine :: SourcePos -> Line -> SourcePos
|
||
|
setSourceLine (SourcePos name line column) n = SourcePos name n column
|
||
|
|
||
|
setSourceColumn :: SourcePos -> Column -> SourcePos
|
||
|
setSourceColumn (SourcePos name line column) n = SourcePos name line n
|
||
|
|
||
|
-- | Update source positions on characters
|
||
|
|
||
|
updatePosString :: SourcePos -> String -> SourcePos
|
||
|
updatePosString pos string
|
||
|
= forcePos (foldl updatePosChar pos string)
|
||
|
|
||
|
updatePosChar :: SourcePos -> Char -> SourcePos
|
||
|
updatePosChar pos@(SourcePos name line column) c
|
||
|
= forcePos $
|
||
|
case c of
|
||
|
'\n' -> SourcePos name (line+1) 1
|
||
|
'\t' -> SourcePos name line (column + 8 - ((column-1) `mod` 8))
|
||
|
_ -> SourcePos name line (column + 1)
|
||
|
|
||
|
forcePos :: SourcePos -> SourcePos
|
||
|
forcePos pos@(SourcePos name line column)
|
||
|
= seq line (seq column (pos))
|
||
|
|
||
|
-- | Show positions
|
||
|
|
||
|
instance Show SourcePos where
|
||
|
show (SourcePos name line column)
|
||
|
| null name = showLineColumn
|
||
|
| otherwise = "\"" ++ name ++ "\" " ++ showLineColumn
|
||
|
where
|
||
|
showLineColumn = "(line " ++ show line ++
|
||
|
", column " ++ show column ++
|
||
|
")"
|