|
module Frontend.Lexer.Tokens where
|
|
|
|
import qualified Data.Text as T
|
|
import Data.Text (Text)
|
|
|
|
data IdClass = ConId | VarId
|
|
deriving (Eq, Show, Ord)
|
|
|
|
data TokenClass
|
|
= TokUnqual IdClass Text
|
|
| TokQual IdClass Text Text
|
|
| TokUnqualOp IdClass Text
|
|
| TokQualOp IdClass Text Text
|
|
| TokString Text
|
|
| TokEof
|
|
|
|
| TokLambda
|
|
| TokArrow
|
|
| TokUnder
|
|
|
|
| TokOParen
|
|
| TokOBrace
|
|
| TokOSquare
|
|
| TokOPragma
|
|
|
|
| TokCParen
|
|
| TokCBrace
|
|
| TokCSquare
|
|
| TokCPragma
|
|
|
|
| TokDoubleColon
|
|
| TokTick
|
|
| TokEqual
|
|
| TokComma
|
|
| TokPipe
|
|
|
|
| TokLet
|
|
| TokIn
|
|
| TokLStart
|
|
| TokLEnd
|
|
|
|
| TokModule
|
|
| TokImport
|
|
| TokQualified
|
|
| TokAs
|
|
| TokWhere
|
|
| TokCase
|
|
| TokOf
|
|
|
|
| TokForeign
|
|
| TokExport
|
|
| TokSafe
|
|
| TokUnsafe
|
|
| TokCCall
|
|
|
|
| TokData
|
|
|
|
| TokSemi
|
|
deriving (Eq, Ord)
|
|
|
|
instance Show TokenClass where
|
|
show (TokUnqual _ id) = T.unpack id
|
|
show (TokQual _ ns id) = T.unpack ns ++ '.':T.unpack id
|
|
show (TokUnqualOp _ id) = T.unpack id
|
|
show (TokQualOp _ ns id) = T.unpack ns ++ '.':T.unpack id
|
|
show (TokString text) = show text
|
|
show TokEof = "<EOF>"
|
|
|
|
show TokLambda = "\\"
|
|
show TokArrow = "->"
|
|
show TokUnder = "_"
|
|
|
|
show TokOParen = "("
|
|
show TokOBrace = "{"
|
|
show TokOSquare = "["
|
|
show TokOPragma = "{-"
|
|
|
|
show TokCParen = ")"
|
|
show TokCBrace = "}"
|
|
show TokCSquare = "]"
|
|
show TokCPragma = "-}"
|
|
|
|
show TokDoubleColon = "::"
|
|
show TokTick = "`"
|
|
show TokEqual = "="
|
|
show TokComma = ","
|
|
show TokPipe = "|"
|
|
show TokSemi = ";"
|
|
|
|
show TokLet = "let"
|
|
show TokIn = "in"
|
|
show TokLStart = ""
|
|
show TokLEnd = ""
|
|
|
|
show TokModule = "module"
|
|
show TokImport = "import"
|
|
show TokQualified = "qualified"
|
|
show TokAs = "as"
|
|
show TokWhere = "where"
|
|
show TokCase = "case"
|
|
show TokOf = "of"
|
|
show TokData = "data"
|
|
|
|
show TokForeign = "foreign"
|
|
show TokExport = "export"
|
|
show TokSafe = "export"
|
|
show TokUnsafe = "export"
|
|
show TokCCall = "export"
|
|
|
|
isKeywordToken :: TokenClass -> Bool
|
|
isKeywordToken TokLet = True
|
|
isKeywordToken TokIn = True
|
|
|
|
isKeywordToken TokModule = True
|
|
isKeywordToken TokImport = True
|
|
isKeywordToken TokQualified = True
|
|
isKeywordToken TokAs = True
|
|
isKeywordToken TokWhere = True
|
|
isKeywordToken TokCase = True
|
|
isKeywordToken TokOf = True
|
|
|
|
isKeywordToken TokForeign = True
|
|
isKeywordToken TokExport = True
|
|
isKeywordToken TokSafe = True
|
|
isKeywordToken TokUnsafe = True
|
|
isKeywordToken TokCCall = True
|
|
|
|
isKeywordToken TokData = True
|
|
|
|
isKeywordToken _ = False
|
|
|
|
tokSize :: TokenClass -> Int
|
|
tokSize = length . show
|
|
|
|
data Token
|
|
= Token { tokenClass :: TokenClass
|
|
, tokStartLine :: !Int
|
|
, tokStartCol :: !Int
|
|
}
|
|
deriving (Eq, Show, Ord)
|