module Helium.Parser.LexerToken where
import Text.ParserCombinators.Parsec.Pos(SourcePos)
import qualified Helium.Utils.Texts as Texts
type Token = (SourcePos,Lexeme)
data Lexeme
= LexChar String
| LexString String
| LexInt String
| LexFloat String
| LexVar String
| LexVarSym String
| LexCon String
| LexConSym String
| LexKeyword String
| LexResVarSym String
| LexResConSym String
| LexSpecial Char
| LexFeedback String
| LexCaseFeedback String
| LexMustUse
| LexHole
| LexInsertedOpenBrace
| LexInsertedCloseBrace
| LexInsertedSemicolon
| LexEOF
deriving Eq
instance Show Lexeme where
show x = case x of
LexChar c -> Texts.parserCharacterLiteral ++ " '" ++ c ++ "'"
LexString s -> Texts.parserStringLiteral ++ " \""++ s ++ "\""
LexInt i -> Texts.parserIntegerLiteral ++ " '" ++ i ++ "'"
LexFloat f -> Texts.parserFloatLiteral ++ " '" ++ f ++ "'"
LexVar n -> Texts.parserVariable ++ " '" ++ n ++ "'"
LexVarSym o -> Texts.parserOperator ++ " '" ++ o ++ "'"
LexCon c -> Texts.parserConstructor ++ " '" ++ c ++ "'"
LexConSym o -> Texts.parserConstructorOperator ++ " '" ++ o ++ "'"
LexKeyword kwd -> Texts.parserKeyword ++ " '" ++ kwd ++ "'"
LexResVarSym s -> "'" ++ s ++ "'"
LexResConSym s -> "'" ++ s ++ "'"
LexSpecial c -> "'" ++ [c] ++ "'"
LexFeedback f -> "Feedback \"" ++ f ++ "\""
LexCaseFeedback f -> "Case feedback \"" ++ f ++ "\""
LexMustUse -> "Must Use"
LexHole -> "Hole"
LexInsertedOpenBrace -> Texts.parserInsertedLBrace
LexInsertedCloseBrace -> Texts.parserEndOfBlock
LexInsertedSemicolon -> Texts.parserNextInBlock
LexEOF -> Texts.parserEndOfFile
lexemeLength :: Lexeme -> Int
lexemeLength l = case l of
LexChar s -> length s + 2
LexString s -> length s + 2
LexInt s -> length s
LexFloat s -> length s
LexVar s -> length s
LexVarSym s -> length s
LexCon s -> length s
LexConSym s -> length s
LexSpecial _ -> 1
LexKeyword s -> length s
LexResVarSym s -> length s
LexResConSym s -> length s
_ -> 0