----------------------------------------------------------------------------- -- | -- 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