packages feed

BNFC-2.5.0: src/formats/ocaml/OCamlUtil.hs

{-
    BNF Converter: OCaml backend utility module
    Copyright (C) 2005  Author:  Kristofer Johannisson

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-}

module OCamlUtil where

import CF
import Utils
import Data.Char (toLower, toUpper)

-- Translate Haskell types to OCaml types
-- Note: OCaml (data-)types start with lowercase letter
fixType :: Cat -> String
fixType s = case s of
    '[':xs -> case break (== ']') xs of 
        (t,"]") -> fixType t +++ "list"
        _ -> s -- should not occur (this means an invariant of the type Cat is broken)
    "Integer" -> "int"
    "Double" -> "float"
    c:cs -> let ls = toLower c : cs in
            if (elem ls reservedOCaml) then (ls ++ "T") else ls
    _ -> s
    
-- as fixType, but leave first character in upper case
fixTypeUpper :: Cat -> String
fixTypeUpper c = case fixType c of
    [] -> []
    c:cs -> toUpper c : cs
    
    
reservedOCaml :: [String]
reservedOCaml = [
    "and","as","assert","asr","begin","class",
    "constraint","do","done","downto","else","end", 
    "exception","external","false","for","fun","function", 
    "functor","if","in","include","inherit","initializer", 
    "land","lazy","let","lor","lsl","lsr", 
    "lxor","match","method","mod","module","mutable", 
    "new","object","of","open","or","private",
    "rec","sig","struct","then","to","true", 
    "try","type","val","virtual","when","while","with"]
    
mkTuple :: [String] -> String
mkTuple [] = ""
mkTuple [x] = x
mkTuple (x:xs) = "(" ++ foldl (\acc e -> acc ++ "," +++ e) x xs ++ ")"

insertBar :: [String] -> [String]
insertBar [] = []
insertBar [x]    = ["    " ++ x]
insertBar (x:xs) = ("    " ++ x ) :  map ("  | " ++) xs

mutualDefs :: [String] -> [String]
mutualDefs defs = case defs of
     []   -> []
     [d]  -> ["let rec" +++ d]
     d:ds -> ("let rec" +++ d) : map ("and" +++) ds