packages feed

ctkl-0.27.0.0: src/Text/CTK/Common.hs

--  Compiler Toolkit: some basic definitions used all over the place
--
--  Author : Manuel M. T. Chakravarty
--  Created: 16 February 95
--
--  Version $Revision: 1.44 $ from $Date: 2000/10/05 07:51:28 $
--
--  Copyright (c) [1995..2000] Manuel M. T. Chakravarty
--
--  This library is free software; you can redistribute it and/or
--  modify it under the terms of the GNU Library General Public
--  License as published by the Free Software Foundation; either
--  version 2 of the License, or (at your option) any later version.
--
--  This library is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
--  Library General Public License for more details.
--
--- DESCRIPTION ---------------------------------------------------------------
--
--  This module provides some definitions used throughout all modules of a
--  compiler.
--
--- DOCU ----------------------------------------------------------------------
--
--  language: Haskell 98
--
--  * May not import anything apart from `Config'.
--
--- TODO ----------------------------------------------------------------------
--

module Text.CTK.Common (
  -- error code
  --
  errorCodeError, errorCodeFatal,
  --
  -- source text positions
  --
  Position, Pos (posOf), nopos, isNopos, dontCarePos,  isDontCarePos,
  builtinPos, isBuiltinPos, internalPos, isInternalPos,
  incPos, tabPos, retPos,
  --
  -- pretty printing
  --
  PrettyPrintMode(..), dftOutWidth, dftOutRibbon,
  --
  -- support for debugging
  --
  assert
) where

import           Text.CTK.Config (assertEnabled)


-- error codes
-- -----------

-- error code when a compilation spotted program errors (EXPORTED)
--
errorCodeError :: Int
errorCodeError  = 1

-- error code for fatal errors aborting the run of the toolkit (EXPORTED)
--
errorCodeFatal :: Int
errorCodeFatal  = 2


-- Miscellaneous stuff for parsing
-- -------------------------------

-- uniform representation of source file positions; the order of the arguments
-- is important as it leads to the desired ordering of source positions
-- (EXPORTED)
--
type Position = (String,    -- file name
         Int,        -- row
         Int)        -- column

-- no position (for unknown position information) (EXPORTED)
--
nopos :: Position
nopos  = ("<no file>", -1, -1)

isNopos                :: Position -> Bool
isNopos (_, -1, -1)  = True
isNopos _         = False

-- don't care position (to be used for invalid position information) (EXPORTED)
--
dontCarePos :: Position
dontCarePos  = ("<invalid>", -2, -2)

isDontCarePos              :: Position -> Bool
isDontCarePos (_, -2, -2)  = True
isDontCarePos _           = False

-- position attached to objects that are hard-coded into the toolkit (EXPORTED)
--
builtinPos :: Position
builtinPos  = ("<built into the compiler>", -3, -3)

isBuiltinPos             :: Position -> Bool
isBuiltinPos (_, -3, -3)  = True
isBuiltinPos _          = False

-- position used for internal errors (EXPORTED)
--
internalPos :: Position
internalPos  = ("<internal error>", -4, -4)

isInternalPos              :: Position -> Bool
isInternalPos (_, -4, -4)  = True
isInternalPos _           = False

-- instances of the class `Pos' are associated with some source text position
-- don't care position (to be used for invalid position information) (EXPORTED)
--
class Pos a where
  posOf :: a -> Position

-- advance column
--
incPos                     :: Position -> Int -> Position
incPos (fname, row, col) n  = (fname, row, col + n)

-- advance column to next tab positions (tabs are at every 8th column)
--
tabPos                   :: Position -> Position
tabPos (fname, row, col)  = (fname, row, (col + 8 - (col - 1) `mod` 8))

-- advance to next line
--
retPos                   :: Position -> Position
retPos (fname, row, col)  = (fname, row + 1, 1)


-- Miscellaneous stuff for pretty printing
-- ---------------------------------------

-- pretty printing modes (EXPORTED)
--
data PrettyPrintMode = PPMRaw        -- display raw structure only
             | PPMVerbose    -- display all available info

-- default parameters used for pretty printing (EXPORTED)
--

dftOutWidth :: Int
dftOutWidth  = 79

dftOutRibbon :: Int
dftOutRibbon  = 50


-- support for debugging
-- ---------------------

-- assert is used to catch internal inconsistencies and raises a fatal internal
-- error if such an inconsistency is spotted (EXPORTED)
--
-- an inconsistency occured when the first argument to `assert' is `False'; in
-- a distribution version, the checks can be disabled by setting
-- `assertEnabled' to `False'---to favour speed
--
assert         :: Bool -> String -> a -> a
assert p msg v  = if assertEnabled
          then
            if p then v else error (premsg ++ msg ++ "\n")
          else
            v
          where
            premsg = "INTERNAL COMPILER ERROR: Assertion failed:\n"