hermit-0.3.0.0: src/HERMIT/Syntax.hs
module 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 || isScriptInfixIdChar c || c `elem` "'"
-- infix identifiers can appear in dictionary names
-- square brackets can appear in dictionary names (specifically, list instances). However, we don't include them here because that would require us to always place spaces around [ ] when defining lists. As a work-around, the user can place "" around any such names.
-- | 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 || isCoreIdFirstChar c || isCoreInfixIdChar c || c `elem` "'[]"
-- infix identifiers can appear in dictionary names
-- square brackets can appear in dictionary names (specifically, list instances)
-- | 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 = "!£$%^&*-+=@#<>?/.:|"
---------------------------------------------------------------------