summaryrefslogtreecommitdiff
path: root/src/runtime/haskell-bind/PGF2.hsc
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2014-12-29 10:59:20 +0000
committerkr.angelov <kr.angelov@gmail.com>2014-12-29 10:59:20 +0000
commit3bd40dbab68c8354d8cfceb6dad32d24b13bc723 (patch)
treeb313cba147c811a720b1f17d5a7c1277fab68a72 /src/runtime/haskell-bind/PGF2.hsc
parent8fd24c3839e7d171e0c4170ae17b26c7ff5aec1b (diff)
API for word alignment in the C runtime and in the Haskell binding
Diffstat (limited to 'src/runtime/haskell-bind/PGF2.hsc')
-rw-r--r--src/runtime/haskell-bind/PGF2.hsc29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/runtime/haskell-bind/PGF2.hsc b/src/runtime/haskell-bind/PGF2.hsc
index 44f9d2b1c..02f74dd7a 100644
--- a/src/runtime/haskell-bind/PGF2.hsc
+++ b/src/runtime/haskell-bind/PGF2.hsc
@@ -15,7 +15,7 @@
module PGF2 (-- * PGF
PGF,readPGF,abstractName,startCat,
-- * Concrete syntax
- Concr,languages,parse,parseWithHeuristics,linearize,
+ Concr,languages,parse,parseWithHeuristics,linearize,alignWords,
-- * Trees
Expr,readExpr,showExpr,mkApp,unApp,mkStr,
-- * Morphology
@@ -362,6 +362,33 @@ linearize lang e = unsafePerformIO $
else do lin <- gu_string_buf_freeze sb pl
peekCString lin
+alignWords :: Concr -> Expr -> [(String, [Int])]
+alignWords lang e = unsafePerformIO $
+ withGuPool $ \pl ->
+ do exn <- gu_new_exn pl
+ seq <- pgf_align_words (concr lang) (expr e) exn pl
+ failed <- gu_exn_is_raised exn
+ if failed
+ then do is_nonexist <- gu_exn_caught exn gu_exn_type_PgfLinNonExist
+ if is_nonexist
+ then return []
+ else do is_exn <- gu_exn_caught exn gu_exn_type_PgfExn
+ if is_exn
+ then do c_msg <- (#peek GuExn, data.data) exn
+ msg <- peekCString c_msg
+ throwIO (PGFError msg)
+ else throwIO (PGFError "The abstract tree cannot be linearized")
+ else do len <- (#peek GuSeq, len) seq
+ arr <- peekArray (fromIntegral (len :: CInt)) (seq `plusPtr` (#offset GuSeq, data))
+ mapM peekAlignmentPhrase arr
+ where
+ peekAlignmentPhrase :: Ptr () -> IO (String, [Int])
+ peekAlignmentPhrase ptr = do
+ c_phrase <- (#peek PgfAlignmentPhrase, phrase) ptr
+ phrase <- peekCString c_phrase
+ n_fids <- (#peek PgfAlignmentPhrase, n_fids) ptr
+ fids <- peekArray (fromIntegral (n_fids :: CInt)) (ptr `plusPtr` (#offset PgfAlignmentPhrase, fids))
+ return (phrase, fids)
-----------------------------------------------------------------------------
-- Helper functions