diff --git a/Make.bat b/Make.bat index 16ba98fa2..d7c77595b 100644 --- a/Make.bat +++ b/Make.bat @@ -99,4 +99,4 @@ for %%m in (%modules%) do ( REM Copy echo Copying to %dest% -copy %dist% %dest% +xcopy %dist% %dest% /d diff --git a/Make.hs b/Make.hs index e97b7f9da..2fccdaae0 100644 --- a/Make.hs +++ b/Make.hs @@ -1,3 +1,7 @@ +-- | Main build script for RGL +-- There is no associated cabal file, but these dependencies are known: +-- * directory >= 1.2.3.0 + import Data.List (find,isPrefixOf,isSuffixOf,(\\),unfoldr) import Data.Maybe (catMaybes) import System.IO (hPutStrLn,stderr) @@ -6,7 +10,7 @@ import System.Exit (ExitCode(..),die) import System.Environment (getArgs,lookupEnv) import System.Process (rawSystem) import System.FilePath (()) -- ,takeFileName,addExtension,dropExtension) -import System.Directory (createDirectoryIfMissing,copyFile,getDirectoryContents,removeDirectoryRecursive,findFile) +import System.Directory (createDirectoryIfMissing,copyFile,getModificationTime,setModificationTime,getDirectoryContents,removeDirectoryRecursive,findFile) import Control.Monad (when,unless) main :: IO () @@ -61,14 +65,20 @@ copyOne :: String -> FilePath -> FilePath -> IO () copyOne file from to = do putStrLn $ "Copying [" ++ file ++ "] " ++ to createDirectoryIfMissing True to - copyFile (from file) (to file) + copyFileWithModificationTime (from file) (to file) -- | Copy all files between directories copyAll :: String -> FilePath -> FilePath -> IO () copyAll msg from to = do putStrLn $ "Copying [" ++ msg ++ "] " ++ to createDirectoryIfMissing True to - mapM_ (\file -> when (file /= "." && file /= "..") $ copyFile (from file) (to file)) =<< getDirectoryContents from + mapM_ (\file -> when (file /= "." && file /= "..") $ copyFileWithModificationTime (from file) (to file)) =<< getDirectoryContents from + +-- | Copy a file together with its modification time but no other meta data +copyFileWithModificationTime :: FilePath -> FilePath -> IO () +copyFileWithModificationTime source destination = do + copyFile source destination + getModificationTime source >>= setModificationTime destination -- | Remove dist directory clean :: IO () diff --git a/Make.sh b/Make.sh index 97870d31d..ce73171c4 100755 --- a/Make.sh +++ b/Make.sh @@ -97,4 +97,4 @@ done # Copy echo "Copying to ${dest}" -cp -R "${dist}"/* "${dest}" +cp -R -p "${dist}"/* "${dest}" diff --git a/Makefile b/Makefile index 7fbc22f5a..7dd6b9157 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ RUNMAKE=runghc Make.hs -.PHONY: build copy install clean +.PHONY: build copy install doc clean default: build copy @@ -14,5 +14,8 @@ copy: install: build copy +doc: build + make -C doc GF_LIB_PATH=../dist + clean: $(RUNMAKE) clean diff --git a/doc/Globes.hs b/doc/Globes.hs index 7be896b61..165d73421 100644 --- a/doc/Globes.hs +++ b/doc/Globes.hs @@ -21,7 +21,7 @@ interlingua = "Meaning" languages = [ "afrikaans", -- "አማርኛ", --- "العربية", + "العربية", "Български", "català", "中文", @@ -45,6 +45,7 @@ languages = [ "پeرسن", "polski", "پنجابی", + "português", "Русский", "ٻولي", "español", diff --git a/doc/Makefile b/doc/Makefile index 4fee45382..556973dd7 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,56 +1,53 @@ -.PHONY: abstract synopsis +.PHONY: abstract synopsis index status -all: exx synopsis +all: synopsis GF_alltenses=$(GF_LIB_PATH)/alltenses +GF=gf +GFDOC=gfdoc index: txt2tags -thtml index.txt status: txt2tags -thtml status.txt -synopsis: + +synopsis: synopsis.html + +S=../src + +# List of languages extracted from MkSynopsis.hs +LANGS=Afr Ara Bul Cat Chi Dan Dut Eng Est Eus Fin Fre Ger Gre Hin Ice Ita Jpn Lav Mlt Mon Nep Nor Nno Pes Pnb Pol Por Ron Rus Snd Spa Swe Tha Urd + +# This list was constructed by observing what files MkSynopsis.hs reads +SRC_FILES=$S/abstract/Common.gf $S/abstract/Cat.gf $S/api/Constructors.gf $S/abstract/Structural.gf $(patsubst %,$S/*/Paradigms%.gf,$(LANGS)) + +EXAMPLES_OUT=$(patsubst %,api-examples-%.txt,$(LANGS)) +INCLUDES=synopsis-intro.txt categories-intro.txt categories-imagemap.html synopsis-additional.txt synopsis-browse.txt synopsis-example.txt + +synopsis.html: MkSynopsis.hs MkExxTable.hs $(INCLUDES) $(EXAMPLES_OUT) $(SRC_FILES) runghc MkSynopsis.hs +categories.png: categories.dot + dot -Tpng $^ > $@ + categories-imagemap.html: categories.dot dot -Tcmapx $^ > $@ abstract: - gfdoc -txthtml ../src/abstract/*.gf - mv ../src/abstract/*.html abstract + $(GFDOC) -txthtml $S/abstract/*.gf + mv $S/abstract/*.html abstract -exx-script: - runghc MkExx.hs api-examples.gfs -exx: exx-script - gf -retain -s $(GF_alltenses)/TryAfr.gfo api-examples-Afr.txt - gf -retain -s $(GF_alltenses)/TryBul.gfo api-examples-Bul.txt - gf -retain -s $(GF_alltenses)/TryCat.gfo api-examples-Cat.txt - gf -retain -s $(GF_alltenses)/TryChi.gfo api-examples-Chi.txt - gf -retain -s $(GF_alltenses)/TryDan.gfo api-examples-Dan.txt - gf -retain -s $(GF_alltenses)/TryDut.gfo api-examples-Dut.txt - gf -retain -s $(GF_alltenses)/TryEng.gfo api-examples-Eng.txt - gf -retain -s $(GF_alltenses)/TryEst.gfo api-examples-Est.txt - gf -retain -s $(GF_alltenses)/TryEus.gfo api-examples-Eus.txt - gf -retain -s $(GF_alltenses)/TryFin.gfo api-examples-Fin.txt - gf -retain -s $(GF_alltenses)/TryFre.gfo api-examples-Fre.txt - gf -retain -s $(GF_alltenses)/TryGer.gfo api-examples-Ger.txt - gf -retain -s $(GF_alltenses)/TryGre.gfo api-examples-Gre.txt - gf -retain -s $(GF_alltenses)/TryHin.gfo api-examples-Hin.txt - gf -retain -s $(GF_alltenses)/TryIce.gfo api-examples-Ice.txt - gf -retain -s $(GF_alltenses)/TryIta.gfo api-examples-Ita.txt - gf -retain -s $(GF_alltenses)/TryJpn.gfo api-examples-Jpn.txt - gf -retain -s $(GF_alltenses)/TryLav.gfo api-examples-Lav.txt - gf -retain -s $(GF_alltenses)/TryMlt.gfo api-examples-Mlt.txt - gf -retain -s $(GF_alltenses)/TryMon.gfo api-examples-Mon.txt - gf -retain -s $(GF_alltenses)/TryNep.gfo api-examples-Nep.txt - gf -retain -s $(GF_alltenses)/TryNor.gfo api-examples-Nor.txt - gf -retain -s $(GF_alltenses)/TryNno.gfo api-examples-Nno.txt - gf -retain -s $(GF_alltenses)/TryPes.gfo api-examples-Pes.txt - gf -retain -s $(GF_alltenses)/TryPnb.gfo api-examples-Pnb.txt - gf -retain -s $(GF_alltenses)/TryPol.gfo api-examples-Pol.txt - gf -retain -s $(GF_alltenses)/TryRon.gfo api-examples-Ron.txt - gf -retain -s $(GF_alltenses)/TryRus.gfo api-examples-Rus.txt - gf -retain -s $(GF_alltenses)/TrySnd.gfo api-examples-Snd.txt - gf -retain -s $(GF_alltenses)/TrySpa.gfo api-examples-Spa.txt - gf -retain -s $(GF_alltenses)/TrySwe.gfo api-examples-Swe.txt - gf -retain -s $(GF_alltenses)/TryTha.gfo api-examples-Tha.txt - gf -retain -s $(GF_alltenses)/TryUrd.gfo api-examples-Urd.txt + +api-examples.gfs: api-examples.txt MkExx.hs + runghc MkExx.hs < $< > $@ + + +# Since .gfo files aren't self-contained, the dependencies given here are +# incomplete. But I am thinking that the Try%.gfo file will always be newer +# than any other files it depends on, so the rule will trigger when +# needed anyway. //TH 2018-10-22 +api-examples-%.txt: $(GF_alltenses)/Try%.gfo api-examples.gfs + GF_LIB_PATH=$(GF_LIB_PATH) $(GF) -retain -s $< $@ + +clean: + rm -rf synopsis.txt api-examples.gfs $(EXAMPLES_OUT) diff --git a/doc/MkExx.hs b/doc/MkExx.hs index bb7551c60..16eb38bfd 100644 --- a/doc/MkExx.hs +++ b/doc/MkExx.hs @@ -52,6 +52,7 @@ langsCoding = [ (("norwegian","Nor"),"Scand"), (("polish", "Pol"),""), (("punjabi", "Pnb"),""), + (("portuguese", "Por"), "Romance"), (("romanian", "Ron"),""), (("russian", "Rus"),""), (("spanish", "Spa"),"Romance"), diff --git a/doc/MkExxTable.hs b/doc/MkExxTable.hs index a7b8a47ca..a45effabc 100644 --- a/doc/MkExxTable.hs +++ b/doc/MkExxTable.hs @@ -1,29 +1,32 @@ module MkExxTable (getApiExx, ApiExx, prApiEx, mkEx) where -import System.Cmd -import System.Environment +--import System.Cmd +import System.Environment(getArgs) +import Control.Monad(when) import qualified Data.Map as M import Data.Char main = do xx <- getArgs - aexx <- getApiExx xx + aexx <- getApiExx' True xx return () -- putStrLn $ prApiExx aexx getApiExx :: [FilePath] -> IO ApiExx -getApiExx xx = do +getApiExx = getApiExx' False + +getApiExx' verbose xx = do s <- readFile (head xx) let aet = getApiExxTrees $ filter validOutput $ mergeOutput $ lines s - aeos <- mapM readApiExxOne xx + aeos <- mapM (readApiExxOne verbose) xx let aexx = mkApiExx $ ("API",aet) : aeos -- putStrLn $ prApiExx aexx return aexx -readApiExxOne file = do +readApiExxOne verbose file = do s <- readFile file let lang = reverse (take 3 (drop 4 (reverse file))) -- api-exx-*Eng*.txt let api = getApiExxOne $ filter validOutput $ mergeOutput $ lines s - putStrLn $ unlines $ prApiEx api --- + when verbose $ putStrLn $ unlines $ prApiEx api --- return (lang,api) -- map function -> language -> example diff --git a/doc/MkSynopsis.hs b/doc/MkSynopsis.hs index 709de13d9..e2040fe49 100644 --- a/doc/MkSynopsis.hs +++ b/doc/MkSynopsis.hs @@ -1,6 +1,6 @@ import MkExxTable -import System.Cmd -import System.Environment +import System.Process(system) +import System.Environment(getArgs) import Data.Char import Data.List import qualified Data.ByteString.Char8 as BS @@ -16,10 +16,10 @@ synopsis = "synopsis.txt" -- the language in which revealed examples are shown revealedLang = "Eng" --- all languages shown +-- all languages shown (a copy of this list appears in Makefile) apiExxFiles = ["api-examples-" ++ lang ++ ".txt" | lang <- words -- "Eng Chi" - "Afr Bul Cat Chi Dan Dut Eng Est Eus Fin Fre Ger Gre Hin Ice Ita Jpn Lav Mlt Mon Nep Nor Nno Pes Pnb Pol Ron Rus Snd Spa Swe Tha Urd" + "Afr Ara Bul Cat Chi Dan Dut Eng Est Eus Fin Fre Ger Gre Hin Ice Ita Jpn Lav Mlt Mon Nep Nor Nno Pes Pnb Pol Por Ron Rus Snd Spa Swe Tha Urd" ] main = do @@ -244,6 +244,7 @@ syntaxAPI = srcPath "/api/Constructors.gf" structuralAPI = srcPath "/abstract/Structural.gf" paradigmFiles = [ ("Afrikaans", srcPath "/afrikaans/ParadigmsAfr.gf"), + ("Arabic", srcPath "/arabic/ParadigmsAra.gf"), ("Basque", srcPath "/basque/ParadigmsEus.gf"), ("Bulgarian", srcPath "/bulgarian/ParadigmsBul.gf"), ("Catalan", srcPath "/catalan/ParadigmsCat.gf"), @@ -269,6 +270,7 @@ paradigmFiles = [ ("Nynorsk", srcPath "/nynorsk/ParadigmsNno.gf"), ("Polish", srcPath "/polish/ParadigmsPol.gf"), ("Punjabi", srcPath "/punjabi/ParadigmsPnb.gf"), + ("Portuguese", srcPath "/portuguese/ParadigmsPor.gf"), ("Romanian", srcPath "/romanian/ParadigmsRon.gf"), ("Russian", srcPath "/russian/ParadigmsRus.gf"), ("Sindhi", srcPath "/sindhi/ParadigmsSnd.gf"), diff --git a/doc/revealpopup.css b/doc/revealpopup.css index fe2dd4c1c..8f96c264f 100644 --- a/doc/revealpopup.css +++ b/doc/revealpopup.css @@ -24,6 +24,9 @@ table { border-collapse: collapse; } td, th { padding: 5px; } th { background: #9df; } td { background: white } +h1,h2,h3,h4 { font-family: sans-serif; color: #303030; + text-shadow: rgba(0,0,0,0.25) 2px 2px 5px; + } /* Quick links */ diff --git a/doc/synopsis-intro.txt b/doc/synopsis-intro.txt index 055a0cecc..3b95dea03 100644 --- a/doc/synopsis-intro.txt +++ b/doc/synopsis-intro.txt @@ -1,15 +1,14 @@ - - - +Versions: [3.9 ./synopsis-v3.9.html] | latest (this one) =Introduction= The GF Resource Grammar Library is the standard library for Grammatical Framework. -It covers the morphology and basic syntax of currently 32 languages: +It covers the morphology and basic syntax of currently 34 languages: Afrikaans, +Arabic, Bulgarian, Catalan, Chinese (simplified), @@ -33,6 +32,7 @@ Norwegian (bokmål), Norwegial (nynorsk), Persian, Polish, +Portuguese, Punjabi, Romanian, Russian, @@ -54,13 +54,13 @@ The main contents are: constructing trees in them. - [Chapter 2 #toc5]: syntactic construction functions, with cross-links and examples. -- [Chapter 3 #toc84]: morphological paradigms. -- [Chapter 4 #toc116]: additional libraries. -- [Chapter 5 #toc122]: how to "browse" the library by +- [Chapter 3 #toc85]: morphological paradigms. +- [Chapter 4 #toc120]: additional libraries. +- [Chapter 5 #toc126]: how to "browse" the library by loading the grammars into the ``gf`` command editor. -- [Chapter 6 #toc123]: a brief example of how application grammars can +- [Chapter 6 #toc127]: a brief example of how application grammars can use the resource modules. -- [Detailed table of contents #toc124]. +- [Detailed table of contents #toc128]. Other relevant documents: diff --git a/doc/synopsis.html b/doc/synopsis-v3.9.html similarity index 100% rename from doc/synopsis.html rename to doc/synopsis-v3.9.html diff --git a/src/arabic/NounAra.gf b/src/arabic/NounAra.gf index a35572820..d20b3e787 100644 --- a/src/arabic/NounAra.gf +++ b/src/arabic/NounAra.gf @@ -5,26 +5,28 @@ flags optimize=noexpand ; lin DetCN det cn = let { - number = sizeToNumber det.n; - state = possState det.d; + cas : Case -> Case = if_then_else Case det.is1sg Bare ; + number = sizeToNumber det.n ; determiner : Case -> Str = \c -> - det.s ! cn.h ! (detGender cn.g det.n) ! c; - noun : Case -> NTable -> Str = \c,nt -> - let cas = if_then_else Case det.is1sg Bare c -- no case vowel with 1sg poss. suff. - in nt ! number - ! nounState det.d number - ! nounCase cas det.n det.d + det.s ! cn.h ! (detGender cn.g det.n) ! c ; + noun : Case -> Str = \c -> + cn.s ! number + ! nounState det.d number + ! nounCase c det.n det.d ; + adj : Case -> Str = \c -> + cn.adj ! number + ! (definite ! det.d) -- Indef remains Indef, rest become Def + ! c } in { s = \\c => case cnB4det det.isPron det.isNum det.n det.d of { False => determiner c - ++ noun c cn.s -- deal with poss. suffix - ++ cn.adj ! number ! state ! c -- normal case+state - ++ cn.np ! c ; - True => noun c cn.s -- deal with poss. suffix - -- ++ determiner c -- or this? - ++ det.s ! cn.h ! cn.g ! c - ++ cn.adj ! number ! state ! c -- normal case+state + ++ noun c + ++ adj c + ++ cn.np ! c ; + True => noun (cas c) -- deal with possessive suffix + ++ determiner c + ++ adj c ++ cn.np ! c }; a = { pgn = agrP3 cn.h cn.g number; @@ -45,23 +47,20 @@ lin }; a = np.a } ; - {- - --should compile.. not working :( wierd error message.. bug? + +{- PPartNP np v2 = let x = case np.a.pgn of { - Per3 g n => ( positAdj (v2.s ! VPPart) ) ! g ! n ! Indef ; - _ => \\_ => [] -- not occuring anyway - } in { - s = \\c => np.s ! c ++ x ! c ; - a = np.a - }; - -} + Per3 g n => positAdj (v2.s ! VPPart) ) ! g ! n ! Indef ; -- doesn't work because trying to glue runtime tokens + Per2 g n => \\_ => [] ; + _ => \\_ => [] + } in np ** { + s = \\c => np.s ! c ++ v2.s ! VPPart ---- TODO: agreement + }; +-} - -- FIXME try parsing something like "this house now" and you'll get - -- an internal compiler error, but it still works.. wierd.. - AdvNP np adv = { - s = \\c => np.s ! c ++ adv.s; - a = np.a + AdvNP np adv = np ** { + s = \\c => np.s ! c ++ adv.s }; {- DetSg quant ord = { @@ -104,7 +103,7 @@ lin PossPron p = { s = \\_,_,_,_ => p.s ! Gen; d = Poss; - is1sg = case p.a.pgn of { Per1 _ => True ; _ => False } ; + is1sg = case p.a.pgn of { Per1 Sing => True ; _ => False } ; isPron = True; isNum = False } ; diff --git a/src/arabic/ParadigmsAra.gf b/src/arabic/ParadigmsAra.gf index f84fc7add..9dea1146f 100644 --- a/src/arabic/ParadigmsAra.gf +++ b/src/arabic/ParadigmsAra.gf @@ -435,8 +435,8 @@ resource ParadigmsAra = open mkPron : (_,_,_ : Str) -> PerGenNum -> NP = \ana,nI,I,pgn -> { s = table { - Acc => nI; - Gen => I; + Acc => BIND ++ nI; -- object suffix + Gen => BIND ++ I; -- possessive suffix _ => ana }; a = {pgn = pgn; isPron = True }; diff --git a/src/arabic/ResAra.gf b/src/arabic/ResAra.gf index bf9a37941..d4f08f631 100644 --- a/src/arabic/ResAra.gf +++ b/src/arabic/ResAra.gf @@ -48,8 +48,6 @@ resource ResAra = PatternsAra ** open Prelude, Predef, OrthoAra, ParamX in { --for roots with 2 consonants (works also for assimilated strs, like fc~, --because the function discards anything after the first two characters mkRoot2 : Str -> Root2 = \fcl -> - -- let { cl = drop 2 fcl} in --drop 1 fcl - -- {f = take 2 fcl; c = take 2 cl}; --take 1 case fcl of { f@? + c@? + _ => { f = f ; c = c } ; _ => error ("mkRoot2: too short root" ++ fcl) @@ -138,7 +136,7 @@ resource ResAra = PatternsAra ** open Prelude, Predef, OrthoAra, ParamX in { VPerf Voice PerGenNum | VImpf Mood Voice PerGenNum | VImp Gender Number - | VPPart ; + | VPPart ; -- TODO: add gender and number (or check if easy to use BIND) PerGenNum = Per3 Gender Number @@ -956,7 +954,7 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> --dual suffixes dl : State => Case => Str = table { - Const => + (Const|Poss) => table { Nom => "َا"; _ => "َيْ" @@ -972,7 +970,7 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> --sound masculine plural suffixes m_pl : State => Case => Str = table { - Const => + (Const|Poss) => table { Nom => "ُو"; _ => "ِي" @@ -1045,9 +1043,6 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> _ => Def --Lkitaabu }; - possState : State -> State = \s -> - case s of { Poss => Def ; - x => x } ; --FIXME needs testing nounCase : Case -> Size -> State -> Case = \c,size,s -> @@ -1271,7 +1266,10 @@ patHollowImp : (_,_ :Str) -> Gender => Number => Str =\xaf,xAf -> mkNum : Str -> Str -> Str -> {s : DForm => CardOrd => Gender => State => Case => Str} = \wAhid,awwal,Ula -> - let { wAhida = wAhid + "َة"} in + let wAhida : Str = case wAhid of { + x + "ة" => mkAt wAhid ; + _ => wAhid + "َة" } + in { s= table { unit => table { NCard => table { diff --git a/src/arabic/StructuralAra.gf b/src/arabic/StructuralAra.gf index 8160f2eff..7931b8132 100644 --- a/src/arabic/StructuralAra.gf +++ b/src/arabic/StructuralAra.gf @@ -43,9 +43,9 @@ concrete StructuralAra of Structural = CatAra ** -- how8many_IDet = mkDet "كَمْ" Pl Const ; -- IL: check (was ["هْو مَني"]) ; -- if_Subj = ss "ِف" ; in8front_Prep = ss "مُقَابِلَ" ; - i_Pron = mkPron "أَنَا" "نِي" "ِي" (Per1 Sing); + i_Pron = mkPron "أَنَا" "نِي" "ي" (Per1 Sing); in_Prep = ss "فِي" ; - it_Pron = mkPron "ِت" "ِت" "ِتس" (Per3 Masc Sg); -- IL: check + it_Pron = he_Pron ; -- was: it_Pron = mkPron "ِت" "ِت" "ِتس" (Per3 Masc Sg); -- less_CAdv = ss "لسّ" ; many_Det = mkDet "جَمِيع" Pl Const ; -- more_CAdv = ss "مْري" ; diff --git a/src/english/CatEng.gf b/src/english/CatEng.gf index d57f7d8f5..3d5b19548 100644 --- a/src/english/CatEng.gf +++ b/src/english/CatEng.gf @@ -92,9 +92,9 @@ concrete CatEng of Cat = CommonX - [Pol,SC,CAdv] ** open ResEng, Prelude in { -- Open lexical classes, e.g. Lexicon - V, VS, VQ, VA = Verb ; -- = {s : VForm => Str} ; - V2, V2A, V2Q, V2S = Verb ** {c2 : Str} ; - V3 = Verb ** {c2, c3 : Str} ; + V, VS, VQ, VA = Verb ; + V2, V2Q, V2S = Verb ** {c2 : Str} ; + V2A,V3 = Verb ** {c2, c3 : Str} ; VV = {s : VVForm => Str ; p : Str ; typ : VVType} ; V2V = Verb ** {c2,c3 : Str ; typ : VVType} ; @@ -114,8 +114,8 @@ concrete CatEng of Cat = CommonX - [Pol,SC,CAdv] ** open ResEng, Prelude in { VPSlash = \s -> predV {s = \\_ => s; p = ""; isRefl = False} ** {c2 = ""; gapInMiddle = False; missingAdv = False } ; V, VS, VQ, VA = \s -> {s = \\_ => s; p = ""; isRefl = False} ; - V2, V2A, V2Q, V2S = \s -> {s = \\_ => s; p = ""; isRefl = False; c2=""} ; - V3 = \s -> {s = \\_ => s; p = ""; isRefl = False; c2,c3=""} ; + V2, V2Q, V2S = \s -> {s = \\_ => s; p = ""; isRefl = False; c2=""} ; + V3, V2A = \s -> {s = \\_ => s; p = ""; isRefl = False; c2,c3=""} ; VV = \s -> {s = \\_ => s; p = ""; isRefl = False; typ = VVInf} ; V2V = \s -> {s = \\_ => s; p = ""; isRefl = False; c2,c3="" ; typ = VVInf} ; diff --git a/src/english/LexiconEng.gf b/src/english/LexiconEng.gf index 7597a7a50..cd9d2a8b8 100644 --- a/src/english/LexiconEng.gf +++ b/src/english/LexiconEng.gf @@ -132,7 +132,7 @@ lin oil_N = regN "oil" ; old_A = regADeg "old" ; open_V2 = dirV2 (mkV "open" "opens" "opened" "opened" "opening") ; - paint_V2A = mkV2A (regV "paint") noPrep ; + paint_V2A = mkV2A (regV "paint") ; paper_N = regN "paper" ; paris_PN = mkPN (mkN nonhuman (mkN "Paris")) ; peace_N = regN "peace" ; diff --git a/src/english/ParadigmsEng.gf b/src/english/ParadigmsEng.gf index d88630e99..1a56707b4 100644 --- a/src/english/ParadigmsEng.gf +++ b/src/english/ParadigmsEng.gf @@ -321,7 +321,11 @@ oper } ; ingV2V : V -> Prep -> Prep -> V2V ; -- e.g. prevent (noPrep NP) (from VP-ing) mkVA : V -> VA ; -- e.g. become (AP) - mkV2A : V -> Prep -> V2A ; -- e.g. paint (NP) (AP) + mkV2A : overload { + mkV2A : V -> V2A ; -- e.g. paint (NP) (AP) + mkV2A : V -> Prep -> V2A ; -- backwards compatibility + mkV2A : V -> Prep -> Prep -> V2A ; -- e.g. strike (NP) as (AP) + } ; mkVQ : V -> VQ ; -- e.g. wonder (QS) mkV2Q : V -> Prep -> V2Q ; -- e.g. ask (NP) (QS) @@ -601,7 +605,11 @@ mkInterj : Str -> Interj ingV2V v p t = lin V2V (prepV2 v p ** {c3 = t.s ; typ = VVPresPart}) ; mkVA v = lin VA v ; - mkV2A v p = lin V2A (prepV2 v p) ; + mkV2A = overload { + mkV2A : V -> V2A = \v -> lin V2A (dirdirV3 v) ; + mkV2A : V -> Prep -> V2A = \v,p -> lin V2A (dirV3 v p) ; + mkV2A : V -> Prep -> Prep -> V2A = \v,p1,p2 -> lin V2A (prepPrepV3 v p1 p2) ; + } ; mkV2Q v p = lin V2Q (prepV2 v p) ; mkAS v = v ; diff --git a/src/english/VerbEng.gf b/src/english/VerbEng.gf index 20fd1863e..cf397e8c7 100644 --- a/src/english/VerbEng.gf +++ b/src/english/VerbEng.gf @@ -21,7 +21,7 @@ concrete VerbEng of Verb = CatEng ** open ResEng, Prelude in { SlashV2S v s = insertExtrac (conjThat ++ s.s) (predVc v) ; ---- insertExtra? --- SlashV2S v s = insertObjc (variants {\\_ => conjThat ++ s.s; \\_ => s.s}) (predVc v) ; SlashV2Q v q = insertExtrac (q.s ! QIndir) (predVc v) ; - SlashV2A v ap = insertObjc (\\a => ap.s ! a) (predVc v) ; ---- + SlashV2A v ap = insertObjc (\\a => v.c3 ++ ap.s ! a) (predVc v) ; ---- ComplSlash vp np = let vp' = case vp.gapInMiddle of {