lentil-1.0.0.0: src/Lentil/Parse/Syntaxes.hs
-----------------------------------------------------------------------------
-- |
-- Module : Lentil.Parse.Syntaxes
-- Copyright : © 2015 Francesco Ariis, Tomislav
-- License : GPLv3 (see the LICENSE file)
--
-- Languages descriptors
-----------------------------------------------------------------------------
module Lentil.Parse.Syntaxes where
import Lentil.Parse.Source
import Lentil.Types
import Text.Parsec
import Control.Applicative hiding (many)
import Prelude
import qualified System.FilePath as SF
import qualified Data.Char as C
type MaybePar = Maybe (ParSource [CommentString])
-- as langParser, with alias added
langParserAlias :: [Alias] -> String -> MaybePar
langParserAlias as fp = maybe (langParser fp) langParser (lookup ext as)
where ext = map C.toLower (SF.takeExtension fp)
extensionList :: [Alias] -> [String]
extensionList as = concatMap fst languages ++ map fst as
-- TODO: add langparsers che sia estensibile e leggibile
-- a compilazione [u:2] [feature:intermediate]
langParser :: String -> MaybePar
langParser fp = lookupExt languages ext
where ext = map C.toLower (SF.takeExtension fp)
languages :: [([String], MaybePar)]
languages = [ ([".hs", ".lhs",
".hsc", ".chs" ], Just haskell),
([".cabal"], Just haskell), -- cabal
([".elm"], Just haskell), -- Elm
([".c", ".h"], Just c),
([".cpp", ".hpp"], Just c), -- C++
([".java"], Just c), -- Java
([".js"], Just javascript),
([".ts"], Just javascript), -- TypeScript
([".pas", ".pp", ".inc"], Just pascal),
([".py"], Just python),
([".coffee"], Just python), -- CoffeeScript
([".rb"], Just ruby),
([".pl", ".pm", ".t"], Just perl),
([".sh"], Just perl), -- shell
([".nix"], Just nix),
([".xml", ".html"], Just xml),
([".txt"], Just text) ]
-- todo multiline signature? [lint]
haskell, c, javascript, pascal, python, ruby :: ParSource [CommentString]
perl, nix :: ParSource [CommentString]
text :: ParSource [CommentString]
xml :: ParSource [CommentString]
haskell = source $ ParSyntax ["--"] [("{-", "-}")]
ClangLike ['"'] ['\'']
c = source $ ParSyntax ["//"] [("/*", "*/")]
ClangLike ['"'] ['\'']
javascript = source $ ParSyntax ["//"] [("/*", "*/")]
ClangLike ['"', '\''] []
pascal = source $ ParSyntax ["//"] [("{", "}" ), ("(*", "*)")]
SQLLike ['\''] []
python = source $ ParSyntax ["#"] [("\"\"\"", "\"\"\"")]
ClangLike ['"', '\''] []
ruby = source $ ParSyntax ["#"] [("=begin", "=end")]
ClangLike ['"', '\''] []
perl = source $ ParSyntax ["#"] []
ClangLike ['"', '\''] []
nix = source $ ParSyntax ["#"] [("/*", "*/")]
ClangLike ['"'] ['\'']
xml = source $ ParSyntax [] [("<!--", "-->")]
ClangLike ['"', '\''] []
text = (:[]) . MultiLine 1 <$> many anyChar
-- ANCILLARIES --
lookupExt :: [([String], MaybePar)] -> String -> MaybePar
lookupExt [] _ = Nothing
lookupExt ((ss,p):ds) e | elem e ss = p
| otherwise = lookupExt ds e