summaryrefslogtreecommitdiff
path: root/src/runtime/haskell-bind/PGF2.hsc
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2014-04-04 11:46:40 +0000
committerkr.angelov <kr.angelov@gmail.com>2014-04-04 11:46:40 +0000
commitbd892b8a1dd74b7f1b0fd66f498bc7c9fef1bf78 (patch)
tree26e0e5c5458d86866ea67ffca56e3a767f5df5ff /src/runtime/haskell-bind/PGF2.hsc
parentdafaef7fec8ac776a56bb269a7c4e6ba1228d923 (diff)
fix the haskell binding to handle parse errors
Diffstat (limited to 'src/runtime/haskell-bind/PGF2.hsc')
-rw-r--r--src/runtime/haskell-bind/PGF2.hsc24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/runtime/haskell-bind/PGF2.hsc b/src/runtime/haskell-bind/PGF2.hsc
index 5944e2369..2ed1e28b9 100644
--- a/src/runtime/haskell-bind/PGF2.hsc
+++ b/src/runtime/haskell-bind/PGF2.hsc
@@ -200,17 +200,31 @@ getAnalysis ref self c_lemma c_anal prob exn = do
anal <- peekCString c_anal
writeIORef ref ((lemma, anal, prob):ans)
-parse :: Concr -> String -> String -> [(Expr,Float)]
+parse :: Concr -> String -> String -> Either String [(Expr,Float)]
parse lang cat sent =
unsafePerformIO $
do parsePl <- gu_new_pool
exprPl <- gu_new_pool
+ exn <- gu_new_exn nullPtr gu_type__type parsePl
enum <- withCString cat $ \cat ->
withCString sent $ \sent ->
- pgf_parse (concr lang) cat sent nullPtr parsePl exprPl
- parseFPl <- newForeignPtr gu_pool_finalizer parsePl
- exprFPl <- newForeignPtr gu_pool_finalizer exprPl
- fromPgfExprEnum enum parseFPl (lang,exprFPl)
+ pgf_parse (concr lang) cat sent exn parsePl exprPl
+ failed <- gu_exn_is_raised exn
+ if failed
+ then do ty <- gu_exn_caught exn
+ if ty == gu_type__PgfParseError
+ then do c_tok <- (#peek GuExn, data.data) exn
+ tok <- peekCString c_tok
+ return (Left tok)
+ else if ty == gu_type__PgfExn
+ then do c_msg <- (#peek GuExn, data.data) exn
+ msg <- peekCString c_msg
+ throw (PGFError msg)
+ else throw (PGFError "Parsing failed")
+ else do parseFPl <- newForeignPtr gu_pool_finalizer parsePl
+ exprFPl <- newForeignPtr gu_pool_finalizer exprPl
+ exprs <- fromPgfExprEnum enum parseFPl (lang,exprFPl)
+ return (Right exprs)
linearize :: Concr -> Expr -> String
linearize lang e = unsafePerformIO $