forked from GitHub/gf-core
Working with interfaces.
Working with interfaces. Created new place for grammar parsers. Created new script jgf2+.
This commit is contained in:
2
bin/jgf2
2
bin/jgf2
@@ -5,7 +5,7 @@ GFHOME=/home/aarne/GF2/bin
|
|||||||
# /.../chalmers.se/fs/cab/cs/.users/markus/home/GF1
|
# /.../chalmers.se/fs/cab/cs/.users/markus/home/GF1
|
||||||
|
|
||||||
JGUILIB=$GFHOME/java/
|
JGUILIB=$GFHOME/java/
|
||||||
GF=$GFHOME/gf2+
|
GF=$GFHOME/gf2
|
||||||
JGUI=GFEditor
|
JGUI=GFEditor
|
||||||
|
|
||||||
java -cp $JGUILIB $JGUI "$GF -java $*"
|
java -cp $JGUILIB $JGUI "$GF -java $*"
|
||||||
|
|||||||
12
bin/jgf2+
Normal file
12
bin/jgf2+
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
# change the value of GFHOME to the directory where you have the gf binary
|
||||||
|
GFHOME=/home/aarne/GF2/bin
|
||||||
|
# /.../chalmers.se/fs/cab/cs/.users/markus/home/GF1
|
||||||
|
|
||||||
|
JGUILIB=$GFHOME/java/
|
||||||
|
GF=$GFHOME/gf2+
|
||||||
|
JGUI=GFEditor2
|
||||||
|
|
||||||
|
java -cp $JGUILIB $JGUI "$GF -java -new $*"
|
||||||
|
|
||||||
@@ -459,7 +459,7 @@ getHarmony : Str -> Str = \u ->
|
|||||||
-- as a separate word ("auto &+ ni"), which needs unlexing. Unlexing also
|
-- as a separate word ("auto &+ ni"), which needs unlexing. Unlexing also
|
||||||
-- has to fix the vowel harmony in cases like "äiti &+ nsä".
|
-- has to fix the vowel harmony in cases like "äiti &+ nsä".
|
||||||
|
|
||||||
suff : Str -> Str = \ni -> "&+" ++ ni ;
|
suff : Str -> Str = \ni -> BIND ++ ni ;
|
||||||
|
|
||||||
possSuffix : Number => Person => Str = \\n,p =>
|
possSuffix : Number => Person => Str = \\n,p =>
|
||||||
suff (case <n,p> of {
|
suff (case <n,p> of {
|
||||||
|
|||||||
@@ -23,12 +23,13 @@ main = do
|
|||||||
xs <- getArgs
|
xs <- getArgs
|
||||||
let (os,fs) = getOptions "-" xs
|
let (os,fs) = getOptions "-" xs
|
||||||
java = oElem forJava os
|
java = oElem forJava os
|
||||||
|
isNew = oElem newParser os ---- temporary hack to have two parallel GUIs
|
||||||
putStrLn $ if java then encodeUTF8 welcomeMsg else welcomeMsg
|
putStrLn $ if java then encodeUTF8 welcomeMsg else welcomeMsg
|
||||||
st <- case fs of
|
st <- case fs of
|
||||||
_ -> useIOE emptyShellState $ foldM (shellStateFromFiles os) emptyShellState fs
|
_ -> useIOE emptyShellState $ foldM (shellStateFromFiles os) emptyShellState fs
|
||||||
--- _ -> return emptyShellState
|
--- _ -> return emptyShellState
|
||||||
if null fs then return () else putCPU
|
if null fs then return () else putCPU
|
||||||
if java then sessionLineJ st else do
|
if java then sessionLineJ isNew st else do
|
||||||
gfInteract (initHState st)
|
gfInteract (initHState st)
|
||||||
return ()
|
return ()
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ markXML n i b =
|
|||||||
else ("<subtree" +++ p +++ c ++ ">", "</subtree>")
|
else ("<subtree" +++ p +++ c ++ ">", "</subtree>")
|
||||||
where
|
where
|
||||||
c = "type=" ++ prt (M.valNode n)
|
c = "type=" ++ prt (M.valNode n)
|
||||||
p = "position=" ++ show i
|
p = "position=" ++ (show $ reverse i)
|
||||||
|
|
||||||
-- for XML in JGF 1, use
|
-- for XML in JGF 1, use
|
||||||
markXMLjgf :: Marker
|
markXMLjgf :: Marker
|
||||||
|
|||||||
1966
src/GF/Canon/ParGFC.hs
Normal file
1966
src/GF/Canon/ParGFC.hs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -13,6 +13,7 @@ import MkResource
|
|||||||
|
|
||||||
-- the main compiler passes
|
-- the main compiler passes
|
||||||
import GetGrammar
|
import GetGrammar
|
||||||
|
import Extend
|
||||||
import Rebuild
|
import Rebuild
|
||||||
import Rename
|
import Rename
|
||||||
import Refresh
|
import Refresh
|
||||||
@@ -93,7 +94,7 @@ reverseModules (MGrammar ms) = MGrammar $ reverse ms
|
|||||||
keepResModules :: Options -> SourceGrammar -> SourceGrammar
|
keepResModules :: Options -> SourceGrammar -> SourceGrammar
|
||||||
keepResModules opts gr =
|
keepResModules opts gr =
|
||||||
if oElem retainOpers opts
|
if oElem retainOpers opts
|
||||||
then MGrammar $ reverse [(i,mi) | (i,mi) <- modules gr, isResourceModule mi]
|
then MGrammar $ reverse [(i,mi) | (i,mi@(ModMod m)) <- modules gr, isModRes m]
|
||||||
else emptyMGrammar
|
else emptyMGrammar
|
||||||
|
|
||||||
|
|
||||||
@@ -157,7 +158,8 @@ makeSourceModule opts env@(k,gr,can) mo@(i,mi) = case mi of
|
|||||||
where
|
where
|
||||||
putp = putPointE opts
|
putp = putPointE opts
|
||||||
|
|
||||||
compileSourceModule :: Options -> CompileEnv -> SourceModule -> IOE (Int,SourceModule)
|
compileSourceModule :: Options -> CompileEnv ->
|
||||||
|
SourceModule -> IOE (Int,SourceModule)
|
||||||
compileSourceModule opts env@(k,gr,can) mo@(i,mi) = do
|
compileSourceModule opts env@(k,gr,can) mo@(i,mi) = do
|
||||||
|
|
||||||
let putp = putPointE opts
|
let putp = putPointE opts
|
||||||
@@ -165,16 +167,25 @@ compileSourceModule opts env@(k,gr,can) mo@(i,mi) = do
|
|||||||
|
|
||||||
mo1 <- ioeErr $ rebuildModule mos mo
|
mo1 <- ioeErr $ rebuildModule mos mo
|
||||||
|
|
||||||
mo2:_ <- putp " renaming " $ ioeErr $ renameModule mos mo1
|
mo1b <- ioeErr $ extendModule mos mo1
|
||||||
|
---- prDebug mo1b
|
||||||
|
|
||||||
(mo3:_,warnings) <- putp " type checking" $ ioeErr $ showCheckModule mos mo2
|
case mo1b of
|
||||||
putStrE warnings
|
(_,ModMod n) | not (isCompleteModule n) -> return (k,mo1b)
|
||||||
|
_ -> do
|
||||||
|
mo2:_ <- putp " renaming " $ ioeErr $ renameModule mos mo1b
|
||||||
|
|
||||||
(k',mo3r:_) <- ioeErr $ refreshModule (k,mos) mo3
|
(mo3:_,warnings) <- putp " type checking" $ ioeErr $ showCheckModule mos mo2
|
||||||
|
putStrE warnings
|
||||||
|
|
||||||
mo4:_ <- putp " optimizing " $ ioeErr $ evalModule mos mo3r
|
(k',mo3r:_) <- ioeErr $ refreshModule (k,mos) mo3
|
||||||
|
|
||||||
|
mo4:_ <- putp " optimizing " $ ioeErr $ evalModule mos mo3r
|
||||||
|
|
||||||
|
return (k',mo4)
|
||||||
|
where
|
||||||
|
prDebug mo = ioeIO $ putStrLn $ prGrammar $ MGrammar [mo] ---- debug
|
||||||
|
|
||||||
return (k',mo4)
|
|
||||||
|
|
||||||
generateModuleCode :: Options -> InitPath -> SourceModule -> IOE GFC.CanonModule
|
generateModuleCode :: Options -> InitPath -> SourceModule -> IOE GFC.CanonModule
|
||||||
generateModuleCode opts path minfo@(name,info) = do
|
generateModuleCode opts path minfo@(name,info) = do
|
||||||
@@ -186,7 +197,7 @@ generateModuleCode opts path minfo@(name,info) = do
|
|||||||
|
|
||||||
-- for resource, also emit gfr
|
-- for resource, also emit gfr
|
||||||
case info of
|
case info of
|
||||||
ModMod m | isResourceModule info && isCompilable info && emit && nomulti -> do
|
ModMod m | isModRes m && isCompilable info && emit && nomulti -> do
|
||||||
let (file,out) = (gfrFile pname, prGrammar (MGrammar [minfo]))
|
let (file,out) = (gfrFile pname, prGrammar (MGrammar [minfo]))
|
||||||
ioeIO $ writeFile file out >> putStr (" wrote file" +++ file)
|
ioeIO $ writeFile file out >> putStr (" wrote file" +++ file)
|
||||||
_ -> return ()
|
_ -> return ()
|
||||||
|
|||||||
@@ -10,27 +10,56 @@ import Operations
|
|||||||
|
|
||||||
import Monad
|
import Monad
|
||||||
|
|
||||||
-- AR 14/5/2003
|
-- AR 14/5/2003 -- 11/11
|
||||||
|
|
||||||
-- The top-level function $extendModInfo$
|
-- The top-level function $extendModule$
|
||||||
-- extends a module symbol table by indirections to the module it extends
|
-- extends a module symbol table by indirections to the module it extends
|
||||||
|
|
||||||
--- this is not in use 5/11/2003
|
extendModule :: [SourceModule] -> SourceModule -> Err SourceModule
|
||||||
extendModInfo :: Ident -> SourceModInfo -> SourceModInfo -> Err SourceModInfo
|
extendModule ms (name,mod) = case mod of
|
||||||
extendModInfo name old new = case (old,new) of
|
ModMod (Module mt st fs me ops js) -> do
|
||||||
(ModMod m0, ModMod (Module mt st fs _ ops js)) -> do
|
|
||||||
testErr (mtype m0 == mt) ("illegal extension type at module" +++ show name)
|
|
||||||
js' <- extendMod name (jments m0) js
|
|
||||||
return $ ModMod (Module mt st fs Nothing ops js)
|
|
||||||
|
|
||||||
-- this is what happens when extending a module: new information is inserted,
|
{- --- building the {s : Str} lincat from js0
|
||||||
-- and the process is interrupted if unification fails
|
js <- case mt of
|
||||||
|
MTConcrete a -> do
|
||||||
|
ModMod ma <- lookupModule (MGrammar ms) a
|
||||||
|
let cats = [c | (c,AbsCat _ _) <- tree2list $ jments ma]
|
||||||
|
jscs = [(c,CncCat (yes defLinType) nope nope) | c <- cats]
|
||||||
|
return $ updatesTreeNondestr jscs js0
|
||||||
|
_ -> return js0
|
||||||
|
-}
|
||||||
|
|
||||||
extendMod :: Ident -> BinTree (Ident,Info) -> BinTree (Ident,Info) ->
|
case me of
|
||||||
|
-- if the module is an extension of another one...
|
||||||
|
Just n -> do
|
||||||
|
(m0,isCompl) <- do
|
||||||
|
m <- lookupModMod (MGrammar ms) n
|
||||||
|
|
||||||
|
-- test that the module types match, and find out if the old is complete
|
||||||
|
testErr (sameMType (mtype m) mt)
|
||||||
|
("illegal extension type to module" +++ prt name)
|
||||||
|
return (m,isCompleteModule m)
|
||||||
|
|
||||||
|
-- build extension in a way depending on whether the old module is complete
|
||||||
|
js1 <- extendMod isCompl n (jments m0) js
|
||||||
|
|
||||||
|
-- if incomplete, throw away extension information
|
||||||
|
let me' = if isCompl then me else Nothing
|
||||||
|
return $ (name,ModMod (Module mt st fs me' ops js1))
|
||||||
|
|
||||||
|
-- if the module is not an extension, just return it
|
||||||
|
_ -> return (name,mod)
|
||||||
|
|
||||||
|
-- When extending a complete module: new information is inserted,
|
||||||
|
-- and the process is interrupted if unification fails.
|
||||||
|
-- If the extended module is incomplete, its judgements are just copied.
|
||||||
|
|
||||||
|
extendMod :: Bool -> Ident -> BinTree (Ident,Info) -> BinTree (Ident,Info) ->
|
||||||
Err (BinTree (Ident,Info))
|
Err (BinTree (Ident,Info))
|
||||||
extendMod name old new = foldM try new $ tree2list old where
|
extendMod isCompl name old new = foldM try new $ tree2list old where
|
||||||
try t i@(c,_) = errIn ("constant" +++ prt c) $
|
try t i@(c,_) = errIn ("constant" +++ prt c) $
|
||||||
tryInsert (extendAnyInfo name) (indirInfo name) t i
|
tryInsert (extendAnyInfo isCompl name) indirIf t i
|
||||||
|
indirIf = if isCompl then indirInfo name else id
|
||||||
|
|
||||||
indirInfo :: Ident -> Info -> Info
|
indirInfo :: Ident -> Info -> Info
|
||||||
indirInfo n info = AnyInd b n' where
|
indirInfo n info = AnyInd b n' where
|
||||||
@@ -41,46 +70,37 @@ indirInfo n info = AnyInd b n' where
|
|||||||
AnyInd b k -> (b,k)
|
AnyInd b k -> (b,k)
|
||||||
_ -> (False,n) ---- canonical in Abs
|
_ -> (False,n) ---- canonical in Abs
|
||||||
|
|
||||||
{- ----
|
|
||||||
case info of
|
|
||||||
AbsFun pty ptr -> AbsFun (perhIndir n pty) (perhIndir n ptr)
|
|
||||||
---- find a suitable indirection for cat info!
|
|
||||||
|
|
||||||
ResOper pty ptr -> ResOper (perhIndir n pty) (perhIndir n ptr)
|
|
||||||
ResParam pp -> ResParam (perhIndir n pp)
|
|
||||||
_ -> info
|
|
||||||
|
|
||||||
CncCat pty ptr ppr -> CncCat (perhIndir n pty) (perhIndir n ptr) (perhIndir n ppr)
|
|
||||||
CncFun m ptr ppr -> CncFun m (perhIndir n ptr) (perhIndir n ppr)
|
|
||||||
-}
|
|
||||||
|
|
||||||
perhIndir :: Ident -> Perh a -> Perh a
|
perhIndir :: Ident -> Perh a -> Perh a
|
||||||
perhIndir n p = case p of
|
perhIndir n p = case p of
|
||||||
Yes _ -> May n
|
Yes _ -> May n
|
||||||
_ -> p
|
_ -> p
|
||||||
|
|
||||||
extendAnyInfo :: Ident -> Info -> Info -> Err Info
|
extendAnyInfo :: Bool -> Ident -> Info -> Info -> Err Info
|
||||||
extendAnyInfo n i j = errIn ("building extension for" +++ prt n) $ case (i,j) of
|
extendAnyInfo isc n i j = errIn ("building extension for" +++ prt n) $ case (i,j) of
|
||||||
(AbsCat mc1 mf1, AbsCat mc2 mf2) ->
|
(AbsCat mc1 mf1, AbsCat mc2 mf2) ->
|
||||||
liftM2 AbsCat (updatePerhaps n mc1 mc2) (updatePerhaps n mf1 mf2) --- add cstrs
|
liftM2 AbsCat (updn mc1 mc2) (updn mf1 mf2) --- add cstrs
|
||||||
(AbsFun mt1 md1, AbsFun mt2 md2) ->
|
(AbsFun mt1 md1, AbsFun mt2 md2) ->
|
||||||
liftM2 AbsFun (updatePerhaps n mt1 mt2) (updatePerhaps n md1 md2) --- add defs
|
liftM2 AbsFun (updn mt1 mt2) (updn md1 md2) --- add defs
|
||||||
|
(ResParam mt1, ResParam mt2) ->
|
||||||
(ResParam mt1, ResParam mt2) -> liftM ResParam $ updatePerhaps n mt1 mt2
|
liftM ResParam $ updn mt1 mt2
|
||||||
(ResValue mt1, ResValue mt2) -> liftM ResValue $ updatePerhaps n mt1 mt2
|
(ResValue mt1, ResValue mt2) ->
|
||||||
(ResOper mt1 m1, ResOper mt2 m2) -> extendResOper n mt1 m1 mt2 m2
|
liftM ResValue $ updn mt1 mt2
|
||||||
|
(ResOper mt1 m1, ResOper mt2 m2) -> ---- extendResOper n mt1 m1 mt2 m2
|
||||||
|
liftM2 ResOper (updn mt1 mt2) (updn m1 m2)
|
||||||
(CncCat mc1 mf1 mp1, CncCat mc2 mf2 mp2) ->
|
(CncCat mc1 mf1 mp1, CncCat mc2 mf2 mp2) ->
|
||||||
liftM3 CncCat (updatePerhaps n mc1 mc2)
|
liftM3 CncCat (updn mc1 mc2) (updn mf1 mf2) (updn mp1 mp2)
|
||||||
(updatePerhaps n mf1 mf2) (updatePerhaps n mp1 mp2)
|
|
||||||
(CncFun m mt1 md1, CncFun _ mt2 md2) ->
|
(CncFun m mt1 md1, CncFun _ mt2 md2) ->
|
||||||
liftM2 (CncFun m) (updatePerhaps n mt1 mt2) (updatePerhaps n md1 md2)
|
liftM2 (CncFun m) (updn mt1 mt2) (updn md1 md2)
|
||||||
|
|
||||||
(AnyInd _ _, ResOper _ _) -> return j ----
|
---- (AnyInd _ _, ResOper _ _) -> return j ----
|
||||||
|
|
||||||
_ -> Bad $ "cannot unify information in" ++++ show i ++++ "and" ++++ show j
|
_ -> Bad $ "cannot unify information in" ++++ show i ++++ "and" ++++ show j
|
||||||
|
where
|
||||||
|
updn = if isc then (updatePerhaps n) else (updatePerhapsHard n)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{- ---- no more needed: this is done in Rebuild
|
||||||
-- opers declared in an interface and defined in an instance are a special case
|
-- opers declared in an interface and defined in an instance are a special case
|
||||||
|
|
||||||
extendResOper n mt1 m1 mt2 m2 = case (m1,m2) of
|
extendResOper n mt1 m1 mt2 m2 = case (m1,m2) of
|
||||||
@@ -93,3 +113,4 @@ extendResOper n mt1 m1 mt2 m2 = case (m1,m2) of
|
|||||||
Q _ c -> Vr c
|
Q _ c -> Vr c
|
||||||
QC _ c -> Vr c
|
QC _ c -> Vr c
|
||||||
_ -> composSafeOp strp t
|
_ -> composSafeOp strp t
|
||||||
|
-}
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ redModInfo (c,info) = do
|
|||||||
c' <- redIdent c
|
c' <- redIdent c
|
||||||
info' <- case info of
|
info' <- case info of
|
||||||
ModMod m -> do
|
ModMod m -> do
|
||||||
(e,os) <- redExtOpen m
|
let isIncompl = mstatus m == MSIncomplete
|
||||||
|
(e,os) <- if isIncompl then return (Nothing,[]) else redExtOpen m ----
|
||||||
flags <- mapM redFlag $ flags m
|
flags <- mapM redFlag $ flags m
|
||||||
(a,mt) <- case mtype m of
|
(a,mt) <- case mtype m of
|
||||||
MTConcrete a -> do
|
MTConcrete a -> do
|
||||||
@@ -51,7 +52,7 @@ redModInfo (c,info) = do
|
|||||||
MTTransfer x y -> return (c',MTTransfer (om x) (om y)) --- c' not needed
|
MTTransfer x y -> return (c',MTTransfer (om x) (om y)) --- c' not needed
|
||||||
|
|
||||||
---- this generates empty GFC. Better: none
|
---- this generates empty GFC. Better: none
|
||||||
let js = if mstatus m == MSIncomplete then NT else jments m
|
let js = if isIncompl then NT else jments m
|
||||||
|
|
||||||
defss <- mapM (redInfo a) $ tree2list $ js
|
defss <- mapM (redInfo a) $ tree2list $ js
|
||||||
defs <- return $ sorted2tree $ concat defss -- sorted, but reduced
|
defs <- return $ sorted2tree $ concat defss -- sorted, but reduced
|
||||||
@@ -62,7 +63,9 @@ redModInfo (c,info) = do
|
|||||||
e' <- case extends m of
|
e' <- case extends m of
|
||||||
Just e -> liftM Just $ redIdent e
|
Just e -> liftM Just $ redIdent e
|
||||||
_ -> return Nothing
|
_ -> return Nothing
|
||||||
os' <- mapM (\ (OQualif q _ i) -> liftM (OSimple q) (redIdent i)) $ opens m
|
os' <- mapM (\o -> case o of
|
||||||
|
OQualif q _ i -> liftM (OSimple q) (redIdent i)
|
||||||
|
_ -> prtBad "cannot translate unqualified open in" c) $ opens m
|
||||||
return (e',os')
|
return (e',os')
|
||||||
om = oSimple . openedModule --- normalizing away qualif
|
om = oSimple . openedModule --- normalizing away qualif
|
||||||
|
|
||||||
|
|||||||
@@ -19,43 +19,38 @@ rebuildModule ms mo@(i,mi) = do
|
|||||||
let gr = MGrammar ms
|
let gr = MGrammar ms
|
||||||
deps <- moduleDeps ms
|
deps <- moduleDeps ms
|
||||||
is <- openInterfaces deps i
|
is <- openInterfaces deps i
|
||||||
mi' <- case mi of
|
mi' <- case mi of
|
||||||
|
|
||||||
-- add the interface type signatures into an instance module
|
-- add the information given in interface into an instance module
|
||||||
ModMod m -> do
|
ModMod m -> do
|
||||||
testErr (null is || mstatus m == MSIncomplete)
|
testErr (null is || mstatus m == MSIncomplete)
|
||||||
("module" +++ prt i +++ "must be declared incomplete")
|
("module" +++ prt i +++
|
||||||
mi' <- case mtype m of
|
"has open interfaces and must therefore be declared incomplete")
|
||||||
|
case mtype m of
|
||||||
MTInstance i0 -> do
|
MTInstance i0 -> do
|
||||||
m0 <- lookupModule gr i0
|
m1 <- lookupModMod gr i0
|
||||||
m' <- case m0 of
|
testErr (isModRes m1) ("interface expected instead of" +++ prt i0)
|
||||||
ModMod m1 | isResourceModule m0 -> do ---- mtype m1 == MTInterface -> do
|
m' <- do
|
||||||
---- checkCompleteInstance m1 m -- do this later, in CheckGrammar
|
js' <- extendMod False i0 (jments m1) (jments m)
|
||||||
js' <- extendMod i (jments m1) (jments m)
|
return $ replaceJudgements m js'
|
||||||
return $ replaceJudgements m js'
|
return $ ModMod m'
|
||||||
_ -> prtBad "interface expected instead of" i0
|
|
||||||
return mi -----
|
|
||||||
_ -> return mi
|
_ -> return mi
|
||||||
return mi'
|
|
||||||
|
|
||||||
-- add the instance opens to an incomplete module "with" instances
|
-- add the instance opens to an incomplete module "with" instances
|
||||||
ModWith mt stat ext ops -> do
|
ModWith mt stat ext ops -> do
|
||||||
let insts = [(inf,inst) |OQualif _ inf inst <- ops]
|
let insts = [(inf,inst) | OQualif _ inf inst <- ops]
|
||||||
let infs = map fst insts
|
let infs = map fst insts
|
||||||
let stat' = ifNull MSComplete (const MSIncomplete)
|
let stat' = ifNull MSComplete (const MSIncomplete)
|
||||||
[i | i <- is, notElem i infs]
|
[i | i <- is, notElem i infs]
|
||||||
testErr (stat' == MSComplete || stat == MSIncomplete)
|
testErr (stat' == MSComplete || stat == MSIncomplete)
|
||||||
("module" +++ prt i +++ "remains incomplete")
|
("module" +++ prt i +++ "remains incomplete")
|
||||||
Module mt0 stat0 fs me ops0 js <- do
|
Module mt0 _ fs me ops0 js <- lookupModMod gr ext
|
||||||
mi <- lookupModule gr ext
|
|
||||||
case mi of
|
|
||||||
ModMod m -> return m --- check compatibility of module type
|
|
||||||
_ -> prtBad "expected regular module in 'with' clause, not" ext
|
|
||||||
let ops1 = ops ++ [o | o <- ops0, notElem (openedModule o) infs]
|
let ops1 = ops ++ [o | o <- ops0, notElem (openedModule o) infs]
|
||||||
++ [oQualif i i | i <- map snd insts] ----
|
++ [oQualif i i | i <- map snd insts] ----
|
||||||
|
++ [oSimple i | i <- map snd insts] ----
|
||||||
--- check if me is incomplete
|
--- check if me is incomplete
|
||||||
return $ ModMod $ Module mt0 stat' fs me ops1
|
return $ ModMod $ Module mt0 stat' fs me ops1 js
|
||||||
(mapTree (qualifInstanceInfo insts) js)
|
---- (mapTree (qualifInstanceInfo insts) js) -- not needed
|
||||||
|
|
||||||
_ -> return mi
|
_ -> return mi
|
||||||
return (i,mi')
|
return (i,mi')
|
||||||
@@ -72,6 +67,7 @@ checkCompleteInstance abs cnc = ifNull (return ()) (Bad . unlines) $
|
|||||||
then id
|
then id
|
||||||
else (("Error: no definition given to" +++ prt f):)
|
else (("Error: no definition given to" +++ prt f):)
|
||||||
|
|
||||||
|
{- ---- should not be needed
|
||||||
qualifInstanceInfo :: [(Ident,Ident)] -> (Ident,Info) -> (Ident,Info)
|
qualifInstanceInfo :: [(Ident,Ident)] -> (Ident,Info) -> (Ident,Info)
|
||||||
qualifInstanceInfo insts (c,i) = (c,qualInfo i) where
|
qualifInstanceInfo insts (c,i) = (c,qualInfo i) where
|
||||||
|
|
||||||
@@ -95,5 +91,5 @@ qualifInstanceInfo insts (c,i) = (c,qualInfo i) where
|
|||||||
qualLin (Just (c,(co,t))) = (Just (c,([(x,qual t) | (x,t) <- co], qual t)))
|
qualLin (Just (c,(co,t))) = (Just (c,([(x,qual t) | (x,t) <- co], qual t)))
|
||||||
qualLin Nothing = Nothing
|
qualLin Nothing = Nothing
|
||||||
|
|
||||||
|
|
||||||
-- NB constructor patterns never appear in interfaces so we need not rename them
|
-- NB constructor patterns never appear in interfaces so we need not rename them
|
||||||
|
-}
|
||||||
|
|||||||
@@ -33,39 +33,13 @@ renameSourceTerm g m t = do
|
|||||||
|
|
||||||
renameModule :: [SourceModule] -> SourceModule -> Err [SourceModule]
|
renameModule :: [SourceModule] -> SourceModule -> Err [SourceModule]
|
||||||
renameModule ms (name,mod) = errIn ("renaming module" +++ prt name) $ case mod of
|
renameModule ms (name,mod) = errIn ("renaming module" +++ prt name) $ case mod of
|
||||||
ModMod (Module mt st fs me ops js) -> do
|
ModMod m@(Module mt st fs me ops js) -> do
|
||||||
(_,mod1@(ModMod m)) <- extendModule ms (name,mod)
|
|
||||||
let js1 = jments m
|
let js1 = jments m
|
||||||
status <- buildStatus (MGrammar ms) name mod1
|
status <- buildStatus (MGrammar ms) name mod
|
||||||
js2 <- mapMTree (renameInfo status) js1
|
js2 <- mapMTree (renameInfo status) js1
|
||||||
let mod2 = ModMod $ Module mt st fs me (map forceQualif ops) js2
|
let mod2 = ModMod $ Module mt st fs me (map forceQualif ops) js2
|
||||||
return $ (name,mod2) : ms
|
return $ (name,mod2) : ms
|
||||||
|
|
||||||
extendModule :: [SourceModule] -> SourceModule -> Err SourceModule
|
|
||||||
extendModule ms (name,mod) = case mod of
|
|
||||||
ModMod (Module mt st fs me ops js0) -> do
|
|
||||||
js <- case mt of
|
|
||||||
{- --- building the {s : Str} lincat
|
|
||||||
MTConcrete a -> do
|
|
||||||
ModMod ma <- lookupModule (MGrammar ms) a
|
|
||||||
let cats = [c | (c,AbsCat _ _) <- tree2list $ jments ma]
|
|
||||||
jscs = [(c,CncCat (yes defLinType) nope nope) | c <- cats]
|
|
||||||
return $ updatesTreeNondestr jscs js0
|
|
||||||
-}
|
|
||||||
_ -> return js0
|
|
||||||
js1 <- case me of
|
|
||||||
Just n -> do
|
|
||||||
m0 <- case lookup n ms of
|
|
||||||
Just (ModMod m) -> do
|
|
||||||
testErr (sameMType (mtype m) mt)
|
|
||||||
("illegal extension type to module" +++ prt name)
|
|
||||||
return m
|
|
||||||
_ -> Bad $ "cannot find extended module" +++ prt n
|
|
||||||
extendMod n (jments m0) js
|
|
||||||
_ -> return js
|
|
||||||
return $ (name,ModMod (Module mt st fs me ops js1))
|
|
||||||
|
|
||||||
|
|
||||||
type Status = (StatusTree, [(OpenSpec Ident, StatusTree)])
|
type Status = (StatusTree, [(OpenSpec Ident, StatusTree)])
|
||||||
|
|
||||||
type StatusTree = BinTree (Ident,StatusInfo)
|
type StatusTree = BinTree (Ident,StatusInfo)
|
||||||
|
|||||||
@@ -63,6 +63,10 @@ updateModule (Module mt ms fs me ops js) i t =
|
|||||||
replaceJudgements :: Module i f t -> BinTree (i,t) -> Module i f t
|
replaceJudgements :: Module i f t -> BinTree (i,t) -> Module i f t
|
||||||
replaceJudgements (Module mt ms fs me ops _) js = Module mt ms fs me ops js
|
replaceJudgements (Module mt ms fs me ops _) js = Module mt ms fs me ops js
|
||||||
|
|
||||||
|
addOpenQualif :: i -> i -> Module i f t -> Module i f t
|
||||||
|
addOpenQualif i j (Module mt ms fs me ops js) =
|
||||||
|
Module mt ms fs me (oQualif i j : ops) js
|
||||||
|
|
||||||
allFlags :: MGrammar i f a -> [f]
|
allFlags :: MGrammar i f a -> [f]
|
||||||
allFlags gr = concat $ map flags $ reverse [m | (_, ModMod m) <- modules gr]
|
allFlags gr = concat $ map flags $ reverse [m | (_, ModMod m) <- modules gr]
|
||||||
|
|
||||||
@@ -191,13 +195,6 @@ data IdentM i = IdentM {
|
|||||||
typeOfModule mi = case mi of
|
typeOfModule mi = case mi of
|
||||||
ModMod m -> mtype m
|
ModMod m -> mtype m
|
||||||
|
|
||||||
isResourceModule mi = case typeOfModule mi of
|
|
||||||
MTResource -> True
|
|
||||||
MTReuse _ -> True
|
|
||||||
MTInterface -> True ---
|
|
||||||
MTInstance _ -> True
|
|
||||||
_ -> False
|
|
||||||
|
|
||||||
abstractOfConcrete :: (Show i, Eq i) => MGrammar i f a -> i -> Err i
|
abstractOfConcrete :: (Show i, Eq i) => MGrammar i f a -> i -> Err i
|
||||||
abstractOfConcrete gr c = do
|
abstractOfConcrete gr c = do
|
||||||
m <- lookupModule gr c
|
m <- lookupModule gr c
|
||||||
@@ -232,6 +229,13 @@ lookupModuleType gr m = do
|
|||||||
mi <- lookupModule gr m
|
mi <- lookupModule gr m
|
||||||
return $ typeOfModule mi
|
return $ typeOfModule mi
|
||||||
|
|
||||||
|
lookupModMod :: (Show i,Eq i) => MGrammar i f a -> i -> Err (Module i f a)
|
||||||
|
lookupModMod gr i = do
|
||||||
|
mo <- lookupModule gr i
|
||||||
|
case mo of
|
||||||
|
ModMod m -> return m
|
||||||
|
_ -> Bad $ "expected proper module, not" +++ show i
|
||||||
|
|
||||||
lookupInfo :: (Show i, Ord i) => Module i f a -> i -> Err a
|
lookupInfo :: (Show i, Ord i) => Module i f a -> i -> Err a
|
||||||
lookupInfo mo i = lookupTree show i (jments mo)
|
lookupInfo mo i = lookupTree show i (jments mo)
|
||||||
|
|
||||||
@@ -241,6 +245,8 @@ isModAbs m = case mtype m of
|
|||||||
|
|
||||||
isModRes m = case mtype m of
|
isModRes m = case mtype m of
|
||||||
MTResource -> True
|
MTResource -> True
|
||||||
|
MTReuse _ -> True
|
||||||
|
MTInterface -> True ---
|
||||||
MTInstance _ -> True
|
MTInstance _ -> True
|
||||||
_ -> False
|
_ -> False
|
||||||
|
|
||||||
@@ -268,3 +274,7 @@ isCompilableModule m = case m of
|
|||||||
MTInterface -> False
|
MTInterface -> False
|
||||||
_ -> mstatus m == MSComplete
|
_ -> mstatus m == MSComplete
|
||||||
_ -> False ---
|
_ -> False ---
|
||||||
|
|
||||||
|
-- interface and "incomplete M" are not complete
|
||||||
|
isCompleteModule :: (Eq i) => Module i f a -> Bool
|
||||||
|
isCompleteModule m = mstatus m == MSComplete && mtype m /= MTInterface
|
||||||
|
|||||||
@@ -409,8 +409,9 @@ displaySStateIn env state = (tree',msg,menu) where
|
|||||||
linAll = map lin grs
|
linAll = map lin grs
|
||||||
separ = singleton . map unlines . intersperse [replicate 72 '*']
|
separ = singleton . map unlines . intersperse [replicate 72 '*']
|
||||||
|
|
||||||
displaySStateJavaX :: CEnv -> SState -> String
|
---- the Boolean is a temporary hack to have two parallel GUIs
|
||||||
displaySStateJavaX env state = unlines $ tagXML "gfedit" $ concat [
|
displaySStateJavaX :: Bool -> CEnv -> SState -> String
|
||||||
|
displaySStateJavaX isNew env state = unlines $ tagXML "gfedit" $ concat [
|
||||||
tagXML "linearizations" (concat
|
tagXML "linearizations" (concat
|
||||||
[tagAttrXML "lin" ("lang", prLanguage lang) ss | (lang,ss) <- lins]),
|
[tagAttrXML "lin" ("lang", prLanguage lang) ss | (lang,ss) <- lins]),
|
||||||
tagXML "tree" tree,
|
tagXML "tree" tree,
|
||||||
@@ -431,7 +432,7 @@ displaySStateJavaX env state = unlines $ tagXML "gfedit" $ concat [
|
|||||||
zipper = stateSState state
|
zipper = stateSState state
|
||||||
linAll = map lin lgrs
|
linAll = map lin lgrs
|
||||||
gr = firstStateGrammar env
|
gr = firstStateGrammar env
|
||||||
mark = markOptXML -- markOptJava
|
mark = if isNew then markOptXML else markOptJava
|
||||||
|
|
||||||
langAbstract = language "Abstract"
|
langAbstract = language "Abstract"
|
||||||
langXML = language "XML"
|
langXML = language "XML"
|
||||||
|
|||||||
@@ -16,34 +16,34 @@ import UTF8
|
|||||||
|
|
||||||
-- GF editing session controlled by e.g. a Java program. AR 16/11/2001
|
-- GF editing session controlled by e.g. a Java program. AR 16/11/2001
|
||||||
|
|
||||||
sessionLineJ :: ShellState -> IO ()
|
---- the Boolean is a temporary hack to have two parallel GUIs
|
||||||
sessionLineJ env = do
|
sessionLineJ :: Bool -> ShellState -> IO ()
|
||||||
|
sessionLineJ isNew env = do
|
||||||
putStrLnFlush $ initEditMsgJavaX env
|
putStrLnFlush $ initEditMsgJavaX env
|
||||||
let env' = addGlobalOptions (options [sizeDisplay "short"]) env
|
let env' = addGlobalOptions (options [sizeDisplay "short"]) env
|
||||||
editLoopJ env' (initSState)
|
editLoopJnewX isNew env' (initSState)
|
||||||
|
|
||||||
editLoopJ :: CEnv -> SState -> IO ()
|
|
||||||
editLoopJ = editLoopJnewX
|
|
||||||
|
|
||||||
-- this is the real version, with XML
|
-- this is the real version, with XML
|
||||||
|
|
||||||
editLoopJnewX :: CEnv -> SState -> IO ()
|
---- the Boolean is a temporary hack to have two parallel GUIs
|
||||||
editLoopJnewX env state = do
|
editLoopJnewX :: Bool -> CEnv -> SState -> IO ()
|
||||||
|
editLoopJnewX isNew env state = do
|
||||||
c <- getCommandUTF
|
c <- getCommandUTF
|
||||||
case c of
|
case c of
|
||||||
CQuit -> return ()
|
CQuit -> return ()
|
||||||
|
|
||||||
c -> do
|
c -> do
|
||||||
(env',state') <- execCommand env c state
|
(env',state') <- execCommand env c state
|
||||||
|
let inits = initAndEditMsgJavaX isNew env' state'
|
||||||
let package = case c of
|
let package = case c of
|
||||||
CCEnvImport _ -> initAndEditMsgJavaX env' state'
|
CCEnvImport _ -> inits
|
||||||
CCEnvEmptyAndImport _ -> initAndEditMsgJavaX env' state'
|
CCEnvEmptyAndImport _ -> inits
|
||||||
CCEnvOpenTerm _ -> initAndEditMsgJavaX env' state'
|
CCEnvOpenTerm _ -> inits
|
||||||
CCEnvOpenString _ -> initAndEditMsgJavaX env' state'
|
CCEnvOpenString _ -> inits
|
||||||
CCEnvEmpty -> initEditMsgJavaX env'
|
CCEnvEmpty -> initEditMsgJavaX env'
|
||||||
_ -> displaySStateJavaX env' state'
|
_ -> displaySStateJavaX isNew env' state'
|
||||||
putStrLnFlush package
|
putStrLnFlush package
|
||||||
editLoopJnewX env' state'
|
editLoopJnewX isNew env' state'
|
||||||
|
|
||||||
welcome =
|
welcome =
|
||||||
"An experimental GF Editor for Java." ++
|
"An experimental GF Editor for Java." ++
|
||||||
@@ -56,5 +56,5 @@ initEditMsgJavaX env = encodeUTF8 $ unlines $ tagXML "gfinit" $
|
|||||||
concat [tagAttrXML "language" ("file",file) [prLanguage lang] |
|
concat [tagAttrXML "language" ("file",file) [prLanguage lang] |
|
||||||
(file,lang) <- zip (allGrammarFileNames env) (allLanguages env)]
|
(file,lang) <- zip (allGrammarFileNames env) (allLanguages env)]
|
||||||
|
|
||||||
initAndEditMsgJavaX env state =
|
initAndEditMsgJavaX isNew env state =
|
||||||
initEditMsgJavaX env ++++ displaySStateJavaX env state
|
initEditMsgJavaX env ++++ displaySStateJavaX isNew env state
|
||||||
|
|||||||
3045
src/GF/Source/ParGF.hs
Normal file
3045
src/GF/Source/ParGF.hs
Normal file
File diff suppressed because one or more lines are too long
@@ -1434,8 +1434,8 @@ public class GFEditor2 extends JFrame implements ActionListener, CaretListener,
|
|||||||
{
|
{
|
||||||
position = jElement.position+"]";
|
position = jElement.position+"]";
|
||||||
System.out.println("SELECTEDTEXT: "+position+"\n");
|
System.out.println("SELECTEDTEXT: "+position+"\n");
|
||||||
//treeChanged = true;
|
treeChanged = true;
|
||||||
//send("mp "+position);
|
send("mp "+position);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
System.out.println("no position in vector of size: "+outputVector.size());
|
System.out.println("no position in vector of size: "+outputVector.size());
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
GHMAKE=ghc
|
GHMAKE=ghc
|
||||||
GHCFLAGS=-package lang -package util -fglasgow-exts
|
GHCFLAGS=-package lang -package util -fglasgow-exts
|
||||||
GHCFUDFLAG=-package Fudgets
|
GHCFUDFLAG=-package Fudgets
|
||||||
GHCINCLUDE=-iapi -icompile -igrammar -iinfra -ishell -isource -icanonical -iuseGrammar -icf -ifor-ghc -iparsing
|
GHCINCLUDE=-iapi -icompile -igrammar -iinfra -ishell -isource -icanonical -iuseGrammar -icf -ifor-ghc -iparsing -iparsers
|
||||||
GHCINCLUDENOFUD=-iapi -icompile -igrammar -iinfra -ishell -isource -icanonical -iuseGrammar -icf -ifor-ghc-nofud -iparsing
|
GHCINCLUDENOFUD=-iapi -icompile -igrammar -iinfra -ishell -isource -icanonical -iuseGrammar -icf -ifor-ghc-nofud -iparsing -iparsers
|
||||||
WINDOWSINCLUDE=-ifor-windows -iapi -icompile -igrammar -iinfra -ishell -isource -icanonical -iuseGrammar -icf -iparsing
|
WINDOWSINCLUDE=-ifor-windows -iapi -icompile -igrammar -iinfra -ishell -isource -icanonical -iuseGrammar -icf -iparsing -iparsers
|
||||||
|
|
||||||
all:
|
all:
|
||||||
make today ; make ghc
|
make today ; make ghc
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
module Today where today = "Mon Nov 10 17:40:41 CET 2003"
|
module Today where today = "Tue Nov 11 17:15:59 CET 2003"
|
||||||
|
|||||||
Reference in New Issue
Block a user