diff options
| author | kr.angelov <kr.angelov@gmail.com> | 2014-04-04 11:46:40 +0000 |
|---|---|---|
| committer | kr.angelov <kr.angelov@gmail.com> | 2014-04-04 11:46:40 +0000 |
| commit | bd892b8a1dd74b7f1b0fd66f498bc7c9fef1bf78 (patch) | |
| tree | 26e0e5c5458d86866ea67ffca56e3a767f5df5ff /src/runtime/haskell-bind/PGF2.hsc | |
| parent | dafaef7fec8ac776a56bb269a7c4e6ba1228d923 (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.hsc | 24 |
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 $ |
