module Language.Cpp.SyntaxToken (
Identifier
, Code
, SyntaxToken(..)
, Directive(..)
, Punctuation
, punc
, unpunc
, puncs
, Keyword
, kw
, unkw
, keywords
) where
import Data.Char
import Data.List
import Numeric
type Identifier = String
type Code = String
data SyntaxToken a
= String String
| Char Char
| Integer Integer
| Floating Rational
| Identifier Identifier
| Directive Directive
| Punctuation Punctuation
| Keyword Keyword
| Comment
| Ext a
deriving (Show, Eq, Ord)
instance Functor SyntaxToken where
fmap func tok = case tok of
String s -> String s
Char c -> Char c
Integer n -> Integer n
Floating f -> Floating f
Identifier i -> Identifier i
Directive d -> Directive d
Punctuation p -> Punctuation p
Keyword k -> Keyword k
Comment -> Comment
Ext x -> Ext (func x)
data Directive
= Include FilePath
| Define Identifier (Maybe [Identifier]) Code
| If Code
| Ifdef Code
| Ifndef Code
| Endif
deriving (Show, Eq, Ord)
newtype Punctuation = Punc String
deriving (Show, Eq, Ord)
punc :: String -> Punctuation
punc = Punc
unpunc :: Punctuation -> String
unpunc (Punc s) = s
puncs :: [Punctuation]
puncs = map punc $ [
"{", "}", "[", "]", "(", ")", "<", ">", "<=", ">=",
"+", "-", "*", "/", "~", "!", "%", "^", "&", "|",
"<<", ">>", "++", "--",
"&&", "||", "==", "!=",
".", "->", ".*", "->*",
"=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "^=", "|=",
"?", ":", ",", ";", "::",
"#", "##",
"\\"
]
newtype Keyword = Kw String
deriving (Show, Eq, Ord)
kw :: String -> Keyword
kw = Kw
unkw :: Keyword -> String
unkw (Kw s) = s
keywords :: [Keyword]
keywords = map kw $ words $ "alignas alignof and and_eq asm auto bitand bitor bool break case catch char char16_t"
++ " char32_t class compl const constexpr const_cast continue decltype default delete do double dynamic_cast"
++ " else enum explicit export extern false float for friend goto if inline int long mutable namespace new"
++ " noexcept not not_eq nullptr operator or or_eq private protected public register reinterpret_cast"
++ " return short signed sizeof static static_assert static_cast struct switch template this thread_local"
++ " throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while xor"
++ " xor_eq"