--# -path=.:../../src/abstract:../../src/common:../../src/api:../../src/prelude:../../src/english
-- --# -path=.:../abstract:../common:../api:../prelude

concrete TestLangEng of TestLang = 
  GrammarEng
  , TestLexiconEng
  , ConstructionEng
  , ExtendEng[PastPartAP,PassVPSlash,
              RNP,ReflRNP,ReflPron,ReflPoss,PredetRNP,AdvRNP,ReflA2RNP,PossPronRNP,ReflPossPron]
  ** open (R=ResEng), (P=ParadigmsEng), Prelude --, (E=ExtendEng)
  in {

  flags 
    startcat = Phr ; unlexer = text ; lexer = text ;

  lin
    SlashV2Vneg v vp = 
      R.insertObjc (\\a => v.c3 ++ R.infVP v.typ vp False R.Simul (R.CNeg True) a) (R.predVc v) ;

  lincat
    VPSlashSlash = VPSlash ** {c3 : Str} ;
  lin 
    ReflVPSlash v3 = (R.predVc ((P.reflV (lin V v3)) ** {c2 = v3.c3 ; missingAdv = True})); 

    ComplSlashSlash vpss np = R.insertObjc 
      (appPrep vpss.c2 (lin NP np)) (vpss ** {c2 = vpss.c3 ; missingAdv = True }) ;

    Slash2V4 v np = (lin VPSlash (R.insertObjc (appPrep v.c2 (lin NP np)) (R.predVc v) 
                                    ** {c2 = v.c3 ; missingAdv = True})) ** { c3 = v.c4 } ; 
    Slash3V4 v np = (lin VPSlash (R.insertObjc (appPrep v.c3 (lin NP np)) (R.predVc v) 
                                    ** {c2 = v.c2 ; missingAdv = True})) ** { c3 = v.c4 } ;
    Slash4V4 v np = (lin VPSlash (R.insertObjc (appPrep v.c4 (lin NP np)) (R.predVc v) 
                                    ** {c2 = v.c2 ; missingAdv = True})) ** { c3 = v.c3 } ;

  oper
    appPrep : Str -> NP -> (R.Agr => Str) = \p,np -> \\_ => p ++ np.s ! R.NPAcc ;

    -- Passive
  lin
    Pass2V3 v np = 
      let vps = R.insertObj (\\_ => v.s ! R.VPPart ++ v.p) (R.predAux R.auxBe) ** {c2 = v.c3} 
      in R.insertObj (\\_ => vps.c2 ++ np.s ! R.NPAcc) vps ;

    Pass3V3 v np = 
      let vps = R.insertObj (\\_ => v.s ! R.VPPart ++ v.p) (R.predAux R.auxBe) ** {c2 = v.c2} 
      in R.insertObj (\\_ => vps.c2 ++ np.s ! R.NPAcc) vps ;

--    PastPartAP = E.PastPartAP ;
--    PassVPSlash = E.PassVPSlash ;

    Pass2V4 v np =
      let vpss = R.insertObj (\\_ => v.s ! R.VPPart ++ v.p) (R.predAux R.auxBe) ** {c2 = v.c3 ; c3 = v.c4} 
      in R.insertObj (\\_ => vpss.c3 ++ np.s ! R.NPAcc) vpss ** {c2 = vpss.c2 ; 
                                                                 missingAdv = True ; 
                                                                 gapInMiddle = False } ;

} ;
