summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbjorn <bjorn@bringert.net>2008-10-03 07:53:37 +0000
committerbjorn <bjorn@bringert.net>2008-10-03 07:53:37 +0000
commit07b38706990dc23784928eb5455836316451c147 (patch)
tree14f3bfecc05f74c0e411d8d345f53658e3768b84 /src
parent1e8699d159dc510c300a5657e1127400030a1c10 (diff)
Fixed variants semantics in PGF linearization to expand make variants of argument lists, to get things like Auto/Wagen gender right.
Diffstat (limited to 'src')
-rw-r--r--src/PGF/Linearize.hs15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/PGF/Linearize.hs b/src/PGF/Linearize.hs
index 5bc40438f..3db937a19 100644
--- a/src/PGF/Linearize.hs
+++ b/src/PGF/Linearize.hs
@@ -4,6 +4,7 @@ import PGF.CId
import PGF.Data
import PGF.Macros
+import Control.Monad
import qualified Data.Map as Map
import Data.List
@@ -41,13 +42,25 @@ untokn ts = case ts of
v:_ -> v
_ -> d
+-- Lifts all variants to the top level (except those in macros).
+liftVariants :: Term -> [Term]
+liftVariants = f
+ where
+ f (R ts) = liftM R $ mapM f ts
+ f (P t1 t2) = liftM2 P (f t1) (f t2)
+ f (S ts) = liftM S $ mapM f ts
+ f (FV ts) = ts >>= f
+ f (W s t) = liftM (W s) $ f t
+ f t = return t
+
linTree :: PGF -> CId -> Tree -> Term
linTree pgf lang = lin
where
lin (Abs xs e ) = case lin e of
R ts -> R $ ts ++ (Data.List.map (kks . prCId) xs)
TM s -> R $ (TM s) : (Data.List.map (kks . prCId) xs)
- lin (Fun fun es) = comp (map lin es) $ look fun
+ lin (Fun fun es) = let argVariants = mapM (liftVariants . lin) es
+ in FV [comp args $ look fun | args <- argVariants]
lin (Lit (LStr s)) = R [kks (show s)] -- quoted
lin (Lit (LInt i)) = R [kks (show i)]
lin (Lit (LFlt d)) = R [kks (show d)]