|
| 1 | + |
| 2 | +module Text.Parsing.Parser.Language |
| 3 | + ( haskellDef |
| 4 | + , haskell |
| 5 | + , emptyDef |
| 6 | + , haskellStyle |
| 7 | + , javaStyle |
| 8 | + ) |
| 9 | + where |
| 10 | + |
| 11 | +import Prelude |
| 12 | + |
| 13 | +import Control.Alt |
| 14 | + |
| 15 | +import Text.Parsing.Parser |
| 16 | +import Text.Parsing.Parser.String |
| 17 | +import Text.Parsing.Parser.Token |
| 18 | + |
| 19 | +----------------------------------------------------------- |
| 20 | +-- Styles: haskellStyle, javaStyle |
| 21 | +----------------------------------------------------------- |
| 22 | + |
| 23 | +-- | This is a minimal token definition for Haskell style languages. It |
| 24 | +-- | defines the style of comments, valid identifiers and case |
| 25 | +-- | sensitivity. It does not define any reserved words or operators. |
| 26 | +haskellStyle :: LanguageDef |
| 27 | +haskellStyle = LanguageDef (unGenLanguageDef emptyDef) |
| 28 | + { commentStart = "{-" |
| 29 | + , commentEnd = "-}" |
| 30 | + , commentLine = "--" |
| 31 | + , nestedComments = true |
| 32 | + , identStart = letter |
| 33 | + , identLetter = alphaNum <|> oneOf ['_', '\''] |
| 34 | + , opStart = op' |
| 35 | + , opLetter = op' |
| 36 | + , reservedOpNames = [] |
| 37 | + , reservedNames = [] |
| 38 | + , caseSensitive = true |
| 39 | + } |
| 40 | + where |
| 41 | + op' :: forall m . (Monad m) => ParserT String m Char |
| 42 | + op' = oneOf [':', '!', '#', '$', '%', '&', '*', '+', '.', '/', '<', '=', '>', '?', '@', '\\', '^', '|', '-', '~'] |
| 43 | + |
| 44 | +-- | This is a minimal token definition for Java style languages. It |
| 45 | +-- | defines the style of comments, valid identifiers and case |
| 46 | +-- | sensitivity. It does not define any reserved words or operators. |
| 47 | +javaStyle :: LanguageDef |
| 48 | +javaStyle = LanguageDef (unGenLanguageDef emptyDef) |
| 49 | + { commentStart = "/*" |
| 50 | + , commentEnd = "*/" |
| 51 | + , commentLine = "//" |
| 52 | + , nestedComments = true |
| 53 | + , identStart = letter |
| 54 | + , identLetter = alphaNum <|> oneOf ['_', '\''] |
| 55 | + , reservedNames = [] |
| 56 | + , reservedOpNames = [] |
| 57 | + , caseSensitive = false |
| 58 | + } |
| 59 | + |
| 60 | +----------------------------------------------------------- |
| 61 | +-- minimal language definition |
| 62 | +-------------------------------------------------------- |
| 63 | + |
| 64 | +-- | This is the most minimal token definition. It is recommended to use |
| 65 | +-- | this definition as the basis for other definitions. `emptyDef` has |
| 66 | +-- | no reserved names or operators, is case sensitive and doesn't accept |
| 67 | +-- | comments, identifiers or operators. |
| 68 | +emptyDef :: LanguageDef |
| 69 | +emptyDef = LanguageDef |
| 70 | + { commentStart: "" |
| 71 | + , commentEnd: "" |
| 72 | + , commentLine: "" |
| 73 | + , nestedComments: true |
| 74 | + , identStart: letter <|> char '_' |
| 75 | + , identLetter: alphaNum <|> oneOf ['_', '\''] |
| 76 | + , opStart: op' |
| 77 | + , opLetter: op' |
| 78 | + , reservedOpNames: [] |
| 79 | + , reservedNames: [] |
| 80 | + , caseSensitive: true |
| 81 | + } |
| 82 | + where |
| 83 | + op' :: forall m . (Monad m) => ParserT String m Char |
| 84 | + op' = oneOf [':', '!', '#', '$', '%', '&', '*', '+', '.', '/', '<', '=', '>', '?', '@', '\\', '^', '|', '-', '~'] |
| 85 | + |
| 86 | +-- ----------------------------------------------------------- |
| 87 | +-- -- Haskell |
| 88 | +-- ----------------------------------------------------------- |
| 89 | + |
| 90 | +-- | A lexer for the haskell language. |
| 91 | +haskell :: TokenParser |
| 92 | +haskell = makeTokenParser haskellDef |
| 93 | + |
| 94 | +-- | The language definition for the Haskell language. |
| 95 | +haskellDef :: LanguageDef |
| 96 | +haskellDef = |
| 97 | + case haskell98Def of |
| 98 | + (LanguageDef def) -> LanguageDef def |
| 99 | + { identLetter = def.identLetter <|> char '#' |
| 100 | + , reservedNames = def.reservedNames <> |
| 101 | + ["foreign","import","export","primitive" |
| 102 | + ,"_ccall_","_casm_" |
| 103 | + ,"forall" |
| 104 | + ] |
| 105 | + } |
| 106 | + |
| 107 | +-- | The language definition for the language Haskell98. |
| 108 | +haskell98Def :: LanguageDef |
| 109 | +haskell98Def = LanguageDef (unGenLanguageDef haskellStyle) |
| 110 | + { reservedOpNames = ["::","..","=","\\","|","<-","->","@","~","=>"] |
| 111 | + , reservedNames = [ "let","in","case","of","if","then","else" |
| 112 | + , "data","type" |
| 113 | + , "class","default","deriving","do","import" |
| 114 | + , "infix","infixl","infixr","instance","module" |
| 115 | + , "newtype","where" |
| 116 | + , "primitive" |
| 117 | + -- "as","qualified","hiding" |
| 118 | + ] |
| 119 | + } |
0 commit comments