2
BNF Converter: Abstract syntax Generator
3
Copyright (C) 2004 Author: Markus Forberg
5
This program is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2 of the License, or
8
(at your option) any later version.
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software
17
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
module CFtoAbstract (cf2Abstract) where
23
import Utils((+++),(++++))
24
import List(intersperse)
26
-- to produce a Haskell module
27
cf2Abstract :: String -> CF -> String
28
cf2Abstract name cf = unlines $
29
("module "++name +++ "where\n") :
30
"-- Haskell module generated by the BNF converter\n" :
31
(map (prSpecialData cf) (specialCats cf) ++ map prData (cf2data cf))
33
prData :: Data -> String
35
"data" +++ cat +++ "=\n " ++
36
concat (intersperse "\n | " (map prRule rules)) ++++
37
" deriving (Eq,Ord,Show)\n"
39
prRule (fun,cats) = unwords (fun:cats)
41
prSpecialData :: CF -> Cat -> String
42
prSpecialData cf cat =
43
unwords ["newtype",cat,"=",cat,contentSpec cf cat,"deriving (Eq,Ord,Show)"]
45
contentSpec :: CF -> Cat -> String
46
contentSpec cf cat = if isPositionCat cf cat then "((Int,Int),String)" else "String"
b'\\ No newline at end of file'