hermit-0.2.0.0: src/Language/HERMIT/Syntax.hs
module Language.HERMIT.Syntax
(
-- * Utility Predicates for lexing Identifiers
-- ** Lexing HERMIT Scripts
isScriptIdFirstChar,
isScriptIdChar,
isScriptInfixIdChar,
-- ** Lexing Core Fragments
isCoreIdFirstChar,
isCoreIdChar,
isCoreInfixIdChar
)
where
import Data.Char (isAlphaNum, isAlpha)
---------------------------------------------------------------------
-- | Characters that are valid as the leading character of an identifier in a HERMIT script.
isScriptIdFirstChar :: Char -> Bool
isScriptIdFirstChar c = isAlphaNum c || c `elem` "$_:."
-- | Characters that are valid identifier elements (a superset of 'isScriptIdFirstChar') in a HERMIT script.
isScriptIdChar :: Char -> Bool
isScriptIdChar c = isScriptIdFirstChar c || c `elem` "-'"
-- | Characters that are valid in infix operators in a HERMIT script.
isScriptInfixIdChar :: Char -> Bool
isScriptInfixIdChar c = c `elem` infixOperatorSymbols
-- old: "!£$%^&*-+=@#<>?/.:|"
---------------------------------------------------------------------
-- | Chars that are valid as the leading character of an identifier in a Core fragment.
isCoreIdFirstChar :: Char -> Bool
isCoreIdFirstChar c = c `elem` "_$[]:.=" || isAlpha c
-- | Characters that are valid identifier elements (a superset of 'isCoreIdFirstChar') in a Core fragment.
isCoreIdChar :: Char -> Bool
isCoreIdChar c = isAlphaNum c || c `elem` "#-'" || isCoreIdFirstChar c
-- | Characters that are valid in infix operators in a Core fragment.
isCoreInfixIdChar :: Char -> Bool
isCoreInfixIdChar c = c `elem` infixOperatorSymbols
-- old: "+*/._-:<>"
---------------------------------------------------------------------
-- TODO: Should the set of infix operator symobls be common to both HERMIT scripts and Core fragments?
-- I'm pretty sure the old definition of isCoreInfixIdChar was too limited at least.
infixOperatorSymbols :: [Char]
infixOperatorSymbols = "!£$%^&*-+=@#<>?/.:|"
---------------------------------------------------------------------