lvmlib-1.0: Lvm/Core/Parsing/Token.hs
--------------------------------------------------------------------------------
-- Copyright 2001-2012, Daan Leijen, Bastiaan Heeren, Jurriaan Hage. This file
-- is distributed under the terms of the BSD3 License. For more information,
-- see the file "LICENSE.txt", which is included in the distribution.
--------------------------------------------------------------------------------
-- $Id: Lexer.hs 269 2012-08-31 15:16:49Z bastiaan $
module Lvm.Core.Parsing.Token
( Token, Lexeme(..), Pos, incpos, newpos
) where
import Text.PrettyPrint.Leijen (Pretty(..))
-----------------------------------------------------------
-- Tokens and lexems
-----------------------------------------------------------
type Pos = (Int,Int)
type Token = (Pos,Lexeme)
data Lexeme = LexUnknown Char
| LexError String
| LexChar Char
| LexString String
| LexInt Integer
| LexFloat Double
| LexId String
| LexQualId String String
| LexOp String
| LexCon String
| LexQualCon String String
| LexConOp String
| LexCOMMA -- ,
| LexQUOTE -- `
| LexSEMI -- ;
| LexBSLASH -- \ (niet meteen een enter hierachter vanwege -cpp)
| LexASG -- =
| LexCOLON -- :
| LexCOLCOL -- ::
| LexDOT -- .
| LexDOTDOT -- ..
| LexBAR -- |
| LexLARROW -- <-
| LexRARROW -- ->
| LexTILDE -- ~
| LexARROW -- =>
| LexAT -- @
| LexEXCL -- !
| LexDASH -- -
| LexLPAREN -- (
| LexRPAREN -- )
| LexLBRACKET -- [
| LexRBRACKET -- ]
| LexLBRACE -- {
| LexRBRACE -- }
| LexLET
| LexIN
| LexDO
| LexWHERE
| LexCASE
| LexOF
| LexIF
| LexTHEN
| LexELSE
| LexDATA
| LexTYPE
| LexMODULE
| LexIMPORT
| LexEOF
-- not standard
| LexLETSTRICT
| LexMATCH
| LexWITH
| LexPRIVATE
| LexPUBLIC
| LexDEFAULT
| LexCON
| LexABSTRACT
| LexINSTR
| LexEXTERN
| LexNOTHING
| LexCUSTOM
| LexSTATIC | LexDYNAMIC | LexRUNTIME
| LexCCALL | LexSTDCALL | LexINSTRCALL
| LexDECORATE | LexORDINAL
deriving (Eq,Show)
instance Pretty Lexeme where
pretty = pretty . show
-----------------------------------------------------------
-- Positions
-----------------------------------------------------------
incpos :: Pos -> Int -> Pos
incpos (line,col) i = (line,col+i)
newpos :: Pos -> Char -> Pos
newpos (line,_) '\n' = (line + 1,1)
newpos (line,col) '\t' = (line, ((((col-1) `div` 8)+1)*8)+1)
newpos (line,col) _ = (line, col+1)