From bee08345cbaac1ed817a031c35e968cf26f7f7c1 Mon Sep 17 00:00:00 2001 From: aarne Date: Wed, 20 Sep 2006 15:19:44 +0000 Subject: [PATCH] brute force parsing method in RunGFCC --- src/GF/Canon/GFCC/GenGFCC.hs | 9 +++++++++ src/GF/Canon/GFCC/RunGFCC.hs | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/src/GF/Canon/GFCC/GenGFCC.hs b/src/GF/Canon/GFCC/GenGFCC.hs index 61365688f..58c185f12 100644 --- a/src/GF/Canon/GFCC/GenGFCC.hs +++ b/src/GF/Canon/GFCC/GenGFCC.hs @@ -61,3 +61,12 @@ generateRandom gen gfcc cat = genTrees (randomRs (0.0, 1.0) gen) cat where let fs = maybe [] id $ M.lookup cat $ cats $ abstract gfcc in [(f,cs) | f <- fs, Just (Typ cs _) <- [M.lookup f $ funs $ abstract gfcc]] + +-- brute-force parsing method; only returns the first result +-- note: you cannot throw away rules with unknown words from the grammar +-- because it is not known which field in each rule may match the input + +parse :: GFCC -> CId -> [String] -> [Exp] +parse gfcc cat ws = [t | t <- gen, s <- lins t, words s == ws] where + gen = take 1024 $ generate gfcc cat + lins t = [linearize gfcc lang t | lang <- cncnames gfcc] diff --git a/src/GF/Canon/GFCC/RunGFCC.hs b/src/GF/Canon/GFCC/RunGFCC.hs index 704b6ced8..a013d7ccb 100644 --- a/src/GF/Canon/GFCC/RunGFCC.hs +++ b/src/GF/Canon/GFCC/RunGFCC.hs @@ -33,6 +33,10 @@ treat grammar s = case words s of "gr":cat:n:_ -> do gen <- newStdGen mapM_ prlins $ take (read n) $ generateRandom gen grammar (CId cat) + "p":cat:ws -> do + case parse grammar (CId cat) ws of + t:_ -> prlins t + _ -> putStrLn "no parse found" _ -> lins $ readExp s where lins t = mapM_ (lin t) $ cncnames grammar