{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE Haskell98 #-}
{-# LANGUAGE RankNTypes #-}
module System.DotFS.Core.Lexers where

import Prelude hiding (lex)

import Text.Parsec
import Text.Parsec.Language
import Text.Parsec.Token as P
import Data.Functor.Identity


-- stuff about the language and the default lexer
tagletter :: forall u. ParsecT [Char] u Data.Functor.Identity.Identity Char
tagletter = oneOf "~!@#$%^&*_+|`-=\\:<>?[]',./"

lang :: LanguageDef st
lang = javaStyle
     { reservedNames = ["commentstyle","tagstyle","if","else","true","false"]
     , caseSensitive = True
     , opStart  = tagletter
     , opLetter = tagletter
     }

lex :: forall u. GenTokenParser String u Identity
lex = P.makeTokenParser lang

-- alternative lexer for style definitions
styleLang :: LanguageDef st
styleLang = emptyDef
          { opStart  = tagletter
          , opLetter = tagletter }

styleLex :: forall u. GenTokenParser String u Identity
styleLex = P.makeTokenParser styleLang