summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2006-09-20 15:19:44 +0000
committeraarne <aarne@cs.chalmers.se>2006-09-20 15:19:44 +0000
commitbe200897b8f56b1d8c96cfda6ecfbc21863473a0 (patch)
tree40c832a20a1778c7698161399651f58bc9f47b6e /src
parent5ac6f4bd7816b6bd8e7ed15b39bd24e7c962542e (diff)
brute force parsing method in RunGFCC
Diffstat (limited to 'src')
-rw-r--r--src/GF/Canon/GFCC/GenGFCC.hs9
-rw-r--r--src/GF/Canon/GFCC/RunGFCC.hs4
2 files changed, 13 insertions, 0 deletions
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