-- -*- Mode: Haskell -*- -- Copyright 1994 by Peter Thiemann -- Ebnf2ps.hs --- the driver module for the syntax diagram generator -- Author : Peter Thiemann -- Created On : Fri Aug 27 09:09:15 1993 -- Last Modified By: Peter Thiemann -- Last Modified On: Mon Dec 27 17:41:11 1993 -- Update Count : 28 -- Status : Unknown, Use with caution! -- -- $Log: Main.hs,v $ -- Revision 1.1 2004/08/05 11:11:58 malcolm -- Add a regression testsuite for the nhc98 compiler. It isn't very good, -- but it is better than nothing. I've been using it for about four years -- on nightly builds, so it's about time it entered the repository! It -- includes a slightly altered version of the nofib suite. -- Instructions are in the README. -- -- Revision 1.5 1997/03/19 01:03:38 simonpj -- Fix nofib/real/ebnf2 -- -- Revision 1.4 1997/03/17 20:35:26 simonpj -- More small changes towards 2.02 -- -- Revision 1.3 1997/03/14 08:08:10 simonpj -- Major update to more-or-less 2.02 -- -- Revision 1.2 1996/07/25 21:24:02 partain -- Bulk of final changes for 2.01 -- -- Revision 1.1 1996/01/08 20:02:39 partain -- Initial revision -- -- Revision 1.3 1994/03/15 15:34:53 thiemann -- added full color support, XColorDB based -- -- Revision 1.2 1993/09/13 10:37:39 thiemann -- Fixed a space leak -- -- Revision 1.1 1993/08/31 12:31:32 thiemann -- Initial revision -- -- $Locker: $ -- module Main (main) where import IO import IOSupplement import CommandLine (parse_cmds) import StringMatch (stringMatch) import Fonts (FONT, makeFont) import EbnfGrammar import HappyParser (theHappyParser) import AbstractSyntax import GrammarTransform (simplify) import EbnfLayout import FigOutput (figShowsWrapper) import PsOutput (psShowsWrapper) import Color import Info -------------------------------------------------------------------------------- main = parse_cmds program -------------------------------------------------------------------------------- program :: String -> Int -> String -> String -> Int -> String -> String -> String -> Int -> Int -> Int -> Int -> Int -- arrowSize -> String -- rgbFileName -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> [String] -> IO () program ntFontName ntFontScale ntColor tFontName tFontScale tColor lineColor fatLineColor borderDistX borderDistY lineWidth fatLineWidth arrowSize rgbFileName happyInput doSimplify psOutput figOutput helpFlag verbose strs | length strs < 2 || helpFlag = hPutStr stderr ("Usage: ebnf2ps [options] BNFfile Nonterminal ...\n" ++unlines usageBlurb) | otherwise = do afmPath <- getPath "AFMPATH" afmPathDefault ntAFM <- readPathFile afmPath (ntFontName++".afm") tAFM <- readPathFile afmPath (tFontName++".afm") rgbPath <- getPath "RGBPATH" rgbPathDefault rgbFileContents <- readPathFile rgbPath rgbFileName `catch` (\ _ -> do message "Color database not found, using fall back data\n" return "") let colorTable = prepareColors rgbFileContents [ntColor, tColor, lineColor, fatLineColor] colorInfo@(c1,c2,c3,c4) = (lookupColor ntColor colorTable, lookupColor tColor colorTable, lookupColor lineColor colorTable, lookupColor fatLineColor colorTable) info = (borderDistX, borderDistY, lineWidth, fatLineWidth, arrowSize, makeFont ntFontName ntFontScale ntAFM, makeFont tFontName tFontScale tAFM, colorInfo) message ("using colors: "++(showsColor c1 . showsColor c2 . showsColor c3 . showsColor c4) "\nfrom rgbPathDefault: "++show rgbPathDefault) inputPath <- getPath "EBNFINPUTS" ebnfInputDefault message ("generating nonterminals: "++show nonterminals++ "\nfrom "++bnfName++ "\nusing input path "++show inputPath) bnfContent <- readPathFile inputPath bnfName if happyInput then let rawInput = theHappyParser bnfContent prods | doSimplify = simplify rawInput | otherwise = rawInput in do message "using happyInput" writeAll outExtension (layoutAll outWrapper info prods nonterminals) else case map (if doSimplify then simplify else id) (parseAll bnfContent) of prods:_ -> do message "using ebnfInput" writeAll outExtension (layoutAll outWrapper info prods nonterminals) _ -> hPutStr stderr ("Could not parse "++bnfName++"\n") where afmPathDefault = ["/usr/local/tex/Adobe", "/usr/local/tex/lib/TeXPS/afm", "."] ebnfInputDefault = ["."] rgbPathDefault = ["/usr/lib/X11", "/usr/local/X11R5/lib/X11"] (bnfName: nonterminals) = strs (outWrapper, outExtension) | figOutput = (figShowsWrapper, ".fig") | otherwise = (psShowsWrapper, ".eps") message what | verbose = hPutStr stderr (what++"\n") | otherwise = return () -------------------------------------------------------------------------------- layoutAll :: WrapperType -> INFO -> [Production] -> [String] -> [(String, String)] layoutAll wrapper info prods nonterminals = [ (ntName, wrapper ntName info (makePictureLayout info prod) "") | prod@(ProdProduction ntName ntAliases _) <- prods, -- ntName `elem` nonterminals ] any (flip stringMatch ntName) nonterminals ] -------------------------------------------------------------------------------- usageBlurb = [ "", "where options may be chosen from the following list:", "", " -ntFont \tPostScript font used for nonterminals", " -ntScale \tpointsize of typeface for nonterminals", " -ntColor \tcolor of typeface for nonterminals", " -tFont \tPostScript font used for terminal strings", " -tScale \tpointsize of typeface for terminals", " -tColor \tcolor of typeface for terminals", " -borderDistX \thorizontal distance of objects from their container", " -borderDistY \tvertical distance of objects from their container", " -lineWidth \tused for connecting lines", " -fatLineWidth \tused for boxes", " -lineColor \tcolor used for connecting lines", " -fatLineColor \tused for boxes", " -arrowSize \tsize of (invisible) box containing an arrow", " -rgbFileName \tfile name for color definitions (default \"rgb.txt\")", " -happy \taccept happy input format", " +ps \tproduce encapulated PostScript output (default)", " +fig \tproduce fig output (FORMAT 2.1)", " +simplify \tsimplify productions (experimental)", " -verbose \tprint some progress messages", " -help \tproduces this list", "", "Only the first occurrence of an option is recognized.", "Environment variables:", "", " AFMPATH\tsearch path for Adobe Font Metric files", " EBNFINPUTS\tsearch path for BNFfiles", " RGBPATH\tsearch path for color definitions" ] -------------------------------------------------------------------------------- writeAll ext [] = return () writeAll ext ((ntName, content): more) = do hPutStr stdout content writeAll ext more -------------------------------------------------------------------------------- str2int :: String -> Int str2int s = case reads s of [] -> 0 ((x,_):_) -> x