forked from GitHub/gf-core
@@ -17,13 +17,13 @@ import GF.Grammar.Lockfield(isLockLabel)
|
||||
import GF.Grammar.Predef(cPredef,cInts)
|
||||
import GF.Compile.Compute.Predef(predef)
|
||||
import GF.Compile.Compute.Value(Predefined(..))
|
||||
import GF.Infra.Ident(ModuleName(..),Ident,ident2raw,rawIdentS,{-prefixIdent,-}showIdent,isWildIdent)
|
||||
import GF.Infra.Ident(ModuleName(..),Ident,ident2raw,rawIdentS,showIdent,isWildIdent)
|
||||
import GF.Infra.Option(Options,optionsPGF)
|
||||
import PGF.Internal(Literal(..))
|
||||
import GF.Compile.Compute.ConcreteNew(GlobalEnv,normalForm,resourceValues)
|
||||
import GF.Grammar.Canonical as C
|
||||
import System.FilePath ((</>), (<.>))
|
||||
import Debug.Trace(trace,traceShow)
|
||||
import qualified Debug.Trace as T
|
||||
|
||||
|
||||
-- | Generate Canonical code for the named abstract syntax and all associated
|
||||
@@ -60,7 +60,6 @@ abstract2canonical absname gr =
|
||||
|
||||
convHypo' (bt,name,t) = TypeBinding (gId name) (convType t)
|
||||
|
||||
|
||||
-- | Generate Canonical code for the all concrete syntaxes associated with
|
||||
-- the named abstract syntax in given the grammar.
|
||||
concretes2canonical :: Options -> ModuleName -> G.Grammar -> [(FilePath, Concrete)]
|
||||
@@ -93,11 +92,7 @@ concrete2canonical gr cenv absname cnc modinfo =
|
||||
else let ((got,need),def) = paramType gr q
|
||||
in def++neededParamTypes (S.union got have) (S.toList need++qs)
|
||||
|
||||
toCanonical :: G.Grammar
|
||||
-> ModuleName
|
||||
-> GlobalEnv
|
||||
-> (Ident, Info)
|
||||
-> [(S.Set QIdent, Either LincatDef LinDef)]
|
||||
toCanonical :: G.Grammar -> ModuleName -> GlobalEnv -> (Ident, Info) -> [(S.Set QIdent, Either LincatDef LinDef)]
|
||||
toCanonical gr absname cenv (name,jment) =
|
||||
case jment of
|
||||
CncCat (Just (L loc typ)) _ _ pprn _ ->
|
||||
@@ -110,7 +105,8 @@ toCanonical gr absname cenv (name,jment) =
|
||||
where
|
||||
tts = tableTypes gr [e']
|
||||
|
||||
e' = unAbs (length params) $
|
||||
e' = cleanupRecordFields lincat $
|
||||
unAbs (length params) $
|
||||
nf loc (mkAbs params (mkApp def (map Vr args)))
|
||||
params = [(b,x)|(b,x,_)<-ctx]
|
||||
args = map snd params
|
||||
@@ -121,7 +117,6 @@ toCanonical gr absname cenv (name,jment) =
|
||||
_ -> []
|
||||
where
|
||||
nf loc = normalForm cenv (L loc name)
|
||||
-- aId n = prefixIdent "A." (gId n)
|
||||
|
||||
unAbs 0 t = t
|
||||
unAbs n (Abs _ _ t) = unAbs (n-1) t
|
||||
@@ -155,7 +150,20 @@ paramTypes gr t =
|
||||
Ok (_,ResParam {}) -> S.singleton q
|
||||
_ -> ignore
|
||||
|
||||
ignore = trace ("Ignore: " ++ show t) S.empty
|
||||
ignore = T.trace ("Ignore: " ++ show t) S.empty
|
||||
|
||||
-- | Filter out record fields from definitions which don't appear in lincat.
|
||||
cleanupRecordFields :: G.Type -> Term -> Term
|
||||
cleanupRecordFields (RecType ls) (R as) =
|
||||
let defnFields = M.fromList ls
|
||||
in R
|
||||
[ (lbl, (mty, t'))
|
||||
| (lbl, (mty, t)) <- as
|
||||
, M.member lbl defnFields
|
||||
, let Just ty = M.lookup lbl defnFields
|
||||
, let t' = cleanupRecordFields ty t
|
||||
]
|
||||
cleanupRecordFields _ t = t
|
||||
|
||||
convert :: G.Grammar -> Term -> LinValue
|
||||
convert gr = convert' gr []
|
||||
|
||||
29
testsuite/canonical/gold/PhrasebookBul.gf
Normal file
29
testsuite/canonical/gold/PhrasebookBul.gf
Normal file
@@ -0,0 +1,29 @@
|
||||
concrete PhrasebookBul of Phrasebook = {
|
||||
param Prelude_Bool = Prelude_False | Prelude_True;
|
||||
param ResBul_AGender = ResBul_AMasc ResBul_Animacy | ResBul_AFem | ResBul_ANeut;
|
||||
param ResBul_Animacy = ResBul_Human | ResBul_NonHuman;
|
||||
param ResBul_Case = ResBul_Acc | ResBul_Dat | ResBul_WithPrep | ResBul_CPrep;
|
||||
param ResBul_NForm =
|
||||
ResBul_NF ParamX_Number ResBul_Species | ResBul_NFSgDefNom |
|
||||
ResBul_NFPlCount | ResBul_NFVocative;
|
||||
param ParamX_Number = ParamX_Sg | ParamX_Pl;
|
||||
param ResBul_Species = ResBul_Indef | ResBul_Def;
|
||||
lincat PlaceKind =
|
||||
{at : {s : Str; c : ResBul_Case}; isPl : Prelude_Bool;
|
||||
name : {s : ResBul_NForm => Str; g : ResBul_AGender};
|
||||
to : {s : Str; c : ResBul_Case}};
|
||||
VerbPhrase = {s : Str};
|
||||
lin Airport =
|
||||
{at = {s = "на"; c = ResBul_Acc}; isPl = Prelude_False;
|
||||
name =
|
||||
{s =
|
||||
table {ResBul_NF ParamX_Sg ResBul_Indef => "летище";
|
||||
ResBul_NF ParamX_Sg ResBul_Def => "летището";
|
||||
ResBul_NF ParamX_Pl ResBul_Indef => "летища";
|
||||
ResBul_NF ParamX_Pl ResBul_Def => "летищата";
|
||||
ResBul_NFSgDefNom => "летището";
|
||||
ResBul_NFPlCount => "летища";
|
||||
ResBul_NFVocative => "летище"};
|
||||
g = ResBul_ANeut};
|
||||
to = {s = "до"; c = ResBul_CPrep}};
|
||||
}
|
||||
@@ -205,9 +205,9 @@ lin VRead =
|
||||
"gelesener"};
|
||||
aux = ResGer_VHaben; particle = ""; prefix = "";
|
||||
vtype = ResGer_VAct};
|
||||
a1 = ""; a2 = ""; adj = "";
|
||||
ext = ""; inf = {s = ""; ctrl = ResGer_NoC; isAux = Prelude_True};
|
||||
infExt = ""; isAux = Prelude_False;
|
||||
a1 = ""; a2 = ""; adj = ""; ext = "";
|
||||
inf = {s = ""; ctrl = ResGer_NoC; isAux = Prelude_True}; infExt = "";
|
||||
isAux = Prelude_False;
|
||||
nn =
|
||||
table {ResGer_Ag ResGer_Masc ParamX_Sg ParamX_P1 =>
|
||||
{p1 = ""; p2 = ""; p3 = ""; p4 = ""; p5 = ""; p6 = ""};
|
||||
|
||||
@@ -9,7 +9,14 @@ if [ $? -ne 0 ]; then
|
||||
echo "Canonical grammar doesn't compile: FAIL"
|
||||
FAILURES=$((FAILURES+1))
|
||||
else
|
||||
echo "Canonical grammar compiles: OK"
|
||||
# echo "Canonical grammar compiles: OK"
|
||||
diff canonical/PhrasebookBul.gf gold/PhrasebookBul.gf
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Canonical grammar doesn't match gold version: FAIL"
|
||||
FAILURES=$((FAILURES+1))
|
||||
else
|
||||
echo "Canonical grammar matches gold version: OK"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user