From 37a35734a57f6bcdbeb38398f2cf3980f1e100b9 Mon Sep 17 00:00:00 2001 From: "john.j.camilleri" Date: Tue, 15 Jul 2014 09:33:22 +0000 Subject: PGF Web Service: include entire completion in full mode When using full=yes in the web service 'complete' command, you now get an additional field 'seq' with the longest possible completion. So, given: lin f1 = ss "the" ; f2 = ss ("the red house" | "the real deal") ; and trying to complete on input "th", you get: [ { "from": "TestCnc", "brackets": { "cat": "_", "fid": 0, "index": 0, "fun": "_", "children": [] }, "text": "th", "completions": [ { "token": "the", "funs": [ { "fun": "f1", "hyps": [], "cat": "C", "seq": "the" }, { "fun": "f2", "hyps": [], "cat": "C", "seq": "the red house" }, { "fun": "f2", "hyps": [], "cat": "C", "seq": "the real deal" } ] } ] } ] --- src/runtime/haskell/PGF/Parse.hs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) (limited to 'src/runtime') diff --git a/src/runtime/haskell/PGF/Parse.hs b/src/runtime/haskell/PGF/Parse.hs index ad31cc25f..40abb78fd 100644 --- a/src/runtime/haskell/PGF/Parse.hs +++ b/src/runtime/haskell/PGF/Parse.hs @@ -15,7 +15,7 @@ module PGF.Parse import Data.Array.IArray import Data.Array.Base (unsafeAt) -import Data.List (isPrefixOf, foldl') +import Data.List (isPrefixOf, foldl', intercalate) import Data.Maybe (fromMaybe, maybeToList) import qualified Data.Map as Map import qualified PGF.TrieMap as TrieMap @@ -506,14 +506,26 @@ type Continuation = TrieMap.TrieMap Token ActiveSet -- | Return the Continuation of a Parsestate with exportable types -- Used by PGFService -getContinuationInfo :: ParseState -> Map.Map [Token] [(FunId, CId)] +getContinuationInfo :: ParseState -> Map.Map [Token] [(FunId, CId, String)] getContinuationInfo pstate = Map.map (map f . Set.toList) contMap where PState abstr concr chart cont = pstate contMap = Map.fromList (TrieMap.toList cont) -- always get [([], _::ActiveSet)] - f :: Active -> (FunId,CId) - f (Active int dotpos funid seqid pargs ak) = (funid, cid) - where CncFun cid _ = cncfuns concr ! funid + f :: Active -> (FunId,CId,String) + f (Active int dotpos funid seqid pargs ak) = (funid, cid, seq) + where + CncFun cid _ = cncfuns concr ! funid + seq = showSeq dotpos (sequences concr ! seqid) + + showSeq :: DotPos -> Sequence -> String + showSeq pos seq = intercalate " " $ scan (drop (pos-1) (elems seq)) + where + -- Scan left-to-right, stop at first non-token + scan :: [Symbol] -> [String] + scan [] = [] + scan (sym:syms) = case sym of + SymKS token -> token : scan syms + _ -> [] ---------------------------------------------------------------- -- Error State -- cgit v1.2.3