mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-22 19:22:50 -06:00
Founding the newly structured GF2.0 cvs archive.
This commit is contained in:
71
src/GF/Compile/GetGrammar.hs
Normal file
71
src/GF/Compile/GetGrammar.hs
Normal file
@@ -0,0 +1,71 @@
|
||||
module GetGrammar where
|
||||
|
||||
import Operations
|
||||
import qualified ErrM as E ----
|
||||
|
||||
import UseIO
|
||||
import Grammar
|
||||
import Modules
|
||||
import PrGrammar
|
||||
import qualified AbsGF as A
|
||||
import SourceToGrammar
|
||||
---- import Macros
|
||||
---- import Rename
|
||||
import Option
|
||||
--- import Custom
|
||||
import ParGF
|
||||
|
||||
import ReadFiles ----
|
||||
|
||||
import List (nub)
|
||||
import Monad (foldM)
|
||||
|
||||
-- this module builds the internal GF grammar that is sent to the type checker
|
||||
|
||||
getSourceModule :: FilePath -> IOE SourceModule
|
||||
getSourceModule file = do
|
||||
string <- readFileIOE file
|
||||
let tokens = myLexer string
|
||||
mo1 <- ioeErr $ err2err $ pModDef tokens
|
||||
ioeErr $ transModDef mo1
|
||||
|
||||
|
||||
-- for old GF format with includes
|
||||
|
||||
getOldGrammar :: FilePath -> IOE SourceGrammar
|
||||
getOldGrammar file = do
|
||||
defs <- parseOldGrammarFiles file
|
||||
let g = A.OldGr A.NoIncl defs
|
||||
ioeErr $ transOldGrammar g file
|
||||
|
||||
parseOldGrammarFiles :: FilePath -> IOE [A.TopDef]
|
||||
parseOldGrammarFiles file = do
|
||||
putStrE $ "reading grammar of old format" +++ file
|
||||
(_, g) <- getImports "" ([],[]) file
|
||||
return g -- now we can throw away includes
|
||||
where
|
||||
getImports oldInitPath (oldImps, oldG) f = do
|
||||
(path,s) <- readFileLibraryIOE oldInitPath f
|
||||
if not (elem path oldImps)
|
||||
then do
|
||||
(imps,g) <- parseOldGrammar path
|
||||
foldM (getImports (initFilePath path)) (path : oldImps, g ++ oldG) imps
|
||||
else
|
||||
return (oldImps, oldG)
|
||||
|
||||
parseOldGrammar :: FilePath -> IOE ([FilePath],[A.TopDef])
|
||||
parseOldGrammar file = do
|
||||
putStrE $ "reading old file" +++ file
|
||||
s <- ioeIO $ readFileIf file
|
||||
A.OldGr incl topdefs <- ioeErr $ err2err $ pOldGrammar $ myLexer $ fixNewlines s
|
||||
includes <- ioeErr $ transInclude incl
|
||||
return (includes, topdefs)
|
||||
|
||||
----
|
||||
|
||||
err2err :: E.Err a -> Err a
|
||||
err2err (E.Ok v) = Ok v
|
||||
err2err (E.Bad s) = Bad s
|
||||
|
||||
ioeEErr = ioeErr . err2err
|
||||
|
||||
Reference in New Issue
Block a user