using the GHC parser and renamer

Kate S. Golder
Wed, 24 Jan 2001 12:35:39 -0500

Hi -

We are trying to use the GHC parser and renamer within a program that we
are writing (a program to take a Haskell program written in multiple
modules, and return a program that is a single module) and.  We were
wondering if you can think of something that we might be missing.  It
compiles fine (when we execute "make all" at the command line), but when
we run the executable it gets through the parser fine, and creates the
uniqueSupply for the renamer, but it doesn't get through the renamer, we
get an errors that say (Main.hs is the file that is being parsed and

		Could not find interface file for 'Prelude'
		in the directories ./*.hi

		Bad interface file::  ./ParseAndRenameFile.hi
		./ParseAndRenameFile.hi:1  Interface file version error; Expected 0
found version 408

	Fail: Compilation had errors

We assume that these are because the renamer needs to look at .hi files,
and that it either can't find them (Prelude.hi) or it has the wrong
version number (ParseAndRenameFile.hi).  How do we tell the renamer where
to look for the interface files, and fix the version error?
I've included the three files (Makefile, Main.hs, and
ParseAndRenameFile.hs) at the bottom of this email.
Thanks in advance for you any thoughts you might have,



HC      = ghc-4.08


HC_OPTS = -cpp -i$(INTERFACE_FILES) $(EXTRA_HC_OPTS) -fglasgow-exts

SRCS = Main.hs ParseAndRenameFile.hs
OBJS = Main.o  ParseAndRenameFile.o 

.SUFFIXES : .o .hs .hi .lhs .hc .s

all: $(OBJS)
	$(HC) -lHSlang -lNewGHC
-L/usr/users/deforest/ghc-4.08/fptools-newgcc-build/lib -o PARF $(HC_OPTS)

# Standard suffix rules

	$(HC) -c $< $(HC_OPTS)

	$(HC) -c $< $(HC_OPTS)

depend :
	$(HC) -M $(HC_OPTS) $(SRCS)

# DO NOT DELETE: Beginning of Haskell dependencies
Main.o : Main.hs
Main.o : ./ParseAndRenameFile.hi
ParseAndRenameFile.o : ParseAndRenameFile.hs
ParseAndRenameFile.o : compiler/basicTypes/UniqSupply.hi
ParseAndRenameFile.o : compiler/rename/Rename.hi
ParseAndRenameFile.o : compiler/utils/FastString.hi
ParseAndRenameFile.o : compiler/hsSyn/HsSyn.hi
ParseAndRenameFile.o : compiler/basicTypes/BasicTypes.hi
ParseAndRenameFile.o : compiler/parser/RdrHsSyn.hi
ParseAndRenameFile.o : compiler/utils/FastString.hi
ParseAndRenameFile.o : compiler/utils/StringBuffer.hi
ParseAndRenameFile.o : compiler/parser/Parser.hi
ParseAndRenameFile.o : compiler/parser/Lex.hi
ParseAndRenameFile.o : compiler/basicTypes/SrcLoc.hi
ParseAndRenameFile.o : compiler/rename/RnMonad.hi
ParseAndRenameFile.o : compiler/main/MkIface.hi
ParseAndRenameFile.o : compiler/typecheck/TcModule.hi
ParseAndRenameFile.o : compiler/basicTypes/Module.hi
ParseAndRenameFile.o : compiler/main/CmdLineOpts.hi
ParseAndRenameFile.o : compiler/main/ErrUtils.hi
ParseAndRenameFile.o : compiler/utils/Outputable.hi
# DO NOT DELETE: End of Haskell dependencies



module Main where

import ParseAndRenameFile

main :: IO ()
main = parseAndRename "Main.hs" 



module ParseAndRenameFile where

import UniqSupply	( mkSplitUniqSupply )
import Rename           ( renameModule )
import FastString
import IO			( hPutStr, stderr )
import HsSyn
import BasicTypes		( NewOrData(..) )
import RdrHsSyn		( RdrNameHsModule )
import FastString		( mkFastCharString, unpackFS )
import StringBuffer	( hGetStringBuffer )
import Parser			( parse )
import Lex			( PState(..), P, ParseResult(..) )
import SrcLoc			( mkSrcLoc )
import RnMonad		( InterfaceDetails(..) )
import MkIface		( startIface, ifaceDecls, endIface )
import TcModule		( TcResults(..), typecheckModule )
import Module			( ModuleName, moduleNameUserString )
import CmdLineOpts
import ErrUtils		( ghcExit )
import Outputable

parseAndRename filename 
    = do {(name, parsed) <- parseFile filename; 
	  	  rn_uniqs       <- mkSplitUniqSupply 'r';
	  	  maybe          <- renameModule rn_uniqs parsed;
	  	  putStr "done \n"

--parseFile is adapted from parseModule in  compiler/main/Main.lhs
parseFile :: String -> IO (ModuleName, RdrNameHsModule)
parseFile filename = do
    {buf <- hGetStringBuffer True{-expand tabs-} filename;
     case parse buf PState{ bol = 0#, 
			    atbol = 1#,
	 	            context = [], 
			    glasgow_exts = glaexts,
		            loc = mkSrcLoc (mkFastString filename) 1 } of

	 PFailed err -> do
		 printErrs err
		 ghcExit 1
		 return (error "parseModule") -- just to get the types right

	 POk _ m@(HsModule mod _ _ _ _ _ _) -> 
		 return (mod, m)
	 glaexts | opt_GlasgowExts = 1#
		 | otherwise       = 0#


Thanks again!