summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn J. Camilleri <john@digitalgrammars.com>2021-07-01 11:47:14 +0200
committerJohn J. Camilleri <john@digitalgrammars.com>2021-07-01 11:47:14 +0200
commite5a2aed5b6e31fe89e94e9fd9c22e2488f85cae8 (patch)
treed085258fe05b04fa735fe770c002e5d62878e550
parent13575b093f265eb8c089df0f40b43ba5fd0f67af (diff)
Remove record fields not in lincat
Fixes #100, #101
-rw-r--r--src/compiler/GF/Compile/GrammarToCanonical.hs30
-rw-r--r--testsuite/canonical/gold/PhrasebookBul.gf29
-rw-r--r--testsuite/canonical/gold/PhrasebookGer.gf6
-rwxr-xr-xtestsuite/canonical/run.sh9
4 files changed, 59 insertions, 15 deletions
diff --git a/src/compiler/GF/Compile/GrammarToCanonical.hs b/src/compiler/GF/Compile/GrammarToCanonical.hs
index 547f7416a..57a761a64 100644
--- a/src/compiler/GF/Compile/GrammarToCanonical.hs
+++ b/src/compiler/GF/Compile/GrammarToCanonical.hs
@@ -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 []
diff --git a/testsuite/canonical/gold/PhrasebookBul.gf b/testsuite/canonical/gold/PhrasebookBul.gf
new file mode 100644
index 000000000..eb10cc48c
--- /dev/null
+++ b/testsuite/canonical/gold/PhrasebookBul.gf
@@ -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}};
+} \ No newline at end of file
diff --git a/testsuite/canonical/gold/PhrasebookGer.gf b/testsuite/canonical/gold/PhrasebookGer.gf
index 22d750b78..912f3b7b1 100644
--- a/testsuite/canonical/gold/PhrasebookGer.gf
+++ b/testsuite/canonical/gold/PhrasebookGer.gf
@@ -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 = ""};
diff --git a/testsuite/canonical/run.sh b/testsuite/canonical/run.sh
index be7d1ff6c..c39f1e557 100755
--- a/testsuite/canonical/run.sh
+++ b/testsuite/canonical/run.sh
@@ -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 ""