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 | TokString Text | TokEof | TokLambda | TokArrow | TokUnder | TokOParen | TokOBrace | TokOSquare | TokOPragma | TokCParen | TokCBrace | TokCSquare | TokCPragma | TokDoubleColon | TokEqual | TokComma | TokPipe | TokLet | TokIn | TokLStart | TokLEnd | TokModule | TokImport | TokQualified | TokAs | TokWhere | TokLambdaCase | TokCase | TokOf | TokData | TokSemi deriving (Eq, Show, Ord) tokSize :: TokenClass -> Int tokSize (TokUnqual _ x) = T.length x tokSize (TokQual _ x y) = T.length x + T.length y + 1 tokSize TokEof = 0 tokSize TokLambda = 1 tokSize TokOParen = 1 tokSize TokOBrace = 1 tokSize TokOSquare = 1 tokSize TokOPragma = 3 tokSize TokCBrace = 1 tokSize TokCParen = 1 tokSize TokCSquare = 1 tokSize TokCPragma = 3 tokSize TokDoubleColon = 2 tokSize TokEqual = 1 tokSize TokComma = 1 tokSize TokSemi = 1 tokSize TokUnder = 1 tokSize TokArrow = 2 tokSize TokIn = 2 tokSize TokLStart = 0 tokSize TokLEnd = 0 tokSize TokPipe = 1 tokSize (TokString t) = 2 + T.length t tokSize TokLambdaCase = length "\\case" tokSize TokWhere = length "where" tokSize TokData = length "data" tokSize TokOf = length "of" tokSize TokCase = length "case" tokSize TokModule = length "module" tokSize TokQualified = length "qualified" tokSize TokImport = length "import" tokSize TokLet = 3 tokSize TokAs = 2 data Token = Token { tokenClass :: TokenClass , tokStartLine :: !Int , tokStartCol :: !Int } deriving (Eq, Show, Ord)