mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-23 09:52:55 -06:00
handle productions in the internal creation API
This commit is contained in:
@@ -38,6 +38,7 @@ data GuMap
|
|||||||
data GuMapItor
|
data GuMapItor
|
||||||
data GuHasher
|
data GuHasher
|
||||||
data GuSeq
|
data GuSeq
|
||||||
|
data GuBuf
|
||||||
data GuPool
|
data GuPool
|
||||||
type GuVariant = Ptr ()
|
type GuVariant = Ptr ()
|
||||||
type GuHash = (#type GuHash)
|
type GuHash = (#type GuHash)
|
||||||
@@ -112,6 +113,9 @@ foreign import ccall unsafe "gu/utf8.h gu_utf8_encode"
|
|||||||
foreign import ccall unsafe "gu/seq.h gu_make_seq"
|
foreign import ccall unsafe "gu/seq.h gu_make_seq"
|
||||||
gu_make_seq :: CSizeT -> CSizeT -> Ptr GuPool -> IO (Ptr GuSeq)
|
gu_make_seq :: CSizeT -> CSizeT -> Ptr GuPool -> IO (Ptr GuSeq)
|
||||||
|
|
||||||
|
foreign import ccall unsafe "gu/seq.h gu_make_buf"
|
||||||
|
gu_make_buf :: CSizeT -> Ptr GuPool -> IO (Ptr GuBuf)
|
||||||
|
|
||||||
foreign import ccall unsafe "gu/map.h gu_make_map"
|
foreign import ccall unsafe "gu/map.h gu_make_map"
|
||||||
gu_make_map :: CSizeT -> Ptr GuHasher -> CSizeT -> Ptr a -> CSizeT -> Ptr GuPool -> IO (Ptr GuMap)
|
gu_make_map :: CSizeT -> Ptr GuHasher -> CSizeT -> Ptr a -> CSizeT -> Ptr GuPool -> IO (Ptr GuMap)
|
||||||
|
|
||||||
@@ -127,6 +131,9 @@ foreign import ccall "gu/map.h gu_map_iter"
|
|||||||
foreign import ccall unsafe "gu/hash.h &gu_int_hasher"
|
foreign import ccall unsafe "gu/hash.h &gu_int_hasher"
|
||||||
gu_int_hasher :: Ptr GuHasher
|
gu_int_hasher :: Ptr GuHasher
|
||||||
|
|
||||||
|
foreign import ccall unsafe "gu/hash.h &gu_addr_hasher"
|
||||||
|
gu_addr_hasher :: Ptr GuHasher
|
||||||
|
|
||||||
foreign import ccall unsafe "gu/hash.h &gu_string_hasher"
|
foreign import ccall unsafe "gu/hash.h &gu_string_hasher"
|
||||||
gu_string_hasher :: Ptr GuHasher
|
gu_string_hasher :: Ptr GuHasher
|
||||||
|
|
||||||
@@ -227,6 +234,9 @@ data PgfGraphvizOptions
|
|||||||
type PgfBindType = (#type PgfBindType)
|
type PgfBindType = (#type PgfBindType)
|
||||||
data PgfAbsFun
|
data PgfAbsFun
|
||||||
data PgfAbsCat
|
data PgfAbsCat
|
||||||
|
data PgfCCat
|
||||||
|
data PgfCncFun
|
||||||
|
data PgfProductionApply
|
||||||
|
|
||||||
foreign import ccall "pgf/pgf.h pgf_read"
|
foreign import ccall "pgf/pgf.h pgf_read"
|
||||||
pgf_read :: CString -> Ptr GuPool -> Ptr GuExn -> IO (Ptr PgfPGF)
|
pgf_read :: CString -> Ptr GuPool -> Ptr GuExn -> IO (Ptr PgfPGF)
|
||||||
@@ -471,3 +481,12 @@ foreign import ccall "pgf/graphviz.h pgf_graphviz_parse_tree"
|
|||||||
|
|
||||||
foreign import ccall "pgf/graphviz.h pgf_graphviz_word_alignment"
|
foreign import ccall "pgf/graphviz.h pgf_graphviz_word_alignment"
|
||||||
pgf_graphviz_word_alignment :: Ptr (Ptr PgfConcr) -> CSizeT -> PgfExpr -> Ptr PgfGraphvizOptions -> Ptr GuOut -> Ptr GuExn -> IO ()
|
pgf_graphviz_word_alignment :: Ptr (Ptr PgfConcr) -> CSizeT -> PgfExpr -> Ptr PgfGraphvizOptions -> Ptr GuOut -> Ptr GuExn -> IO ()
|
||||||
|
|
||||||
|
foreign import ccall "pgf/data.h pgf_parser_index"
|
||||||
|
pgf_parser_index :: Ptr PgfConcr -> Ptr PgfCCat -> GuVariant -> (#type bool) -> Ptr GuPool -> IO ()
|
||||||
|
|
||||||
|
foreign import ccall "pgf/data.h pgf_lzr_index"
|
||||||
|
pgf_lzr_index :: Ptr PgfConcr -> Ptr PgfCCat -> GuVariant -> (#type bool) -> Ptr GuPool -> IO ()
|
||||||
|
|
||||||
|
foreign import ccall "pgf/data.h pgf_production_is_lexical"
|
||||||
|
pgf_production_is_lexical :: Ptr PgfProductionApply -> Ptr GuBuf -> Ptr GuPool -> IO (#type bool)
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import Data.IORef
|
|||||||
import Data.Maybe(fromMaybe)
|
import Data.Maybe(fromMaybe)
|
||||||
import Data.List(sortBy)
|
import Data.List(sortBy)
|
||||||
import Control.Exception(Exception,throwIO)
|
import Control.Exception(Exception,throwIO)
|
||||||
|
import Control.Monad(foldM)
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
|
|
||||||
type Token = String
|
type Token = String
|
||||||
@@ -454,7 +455,7 @@ newHypos hypos pool = do
|
|||||||
Implicit -> (#const PGF_BIND_TYPE_IMPLICIT)
|
Implicit -> (#const PGF_BIND_TYPE_IMPLICIT)
|
||||||
|
|
||||||
|
|
||||||
data AbstrInfo = AbstrInfo (Ptr GuSeq) (Ptr GuSeq) (Map.Map String (Ptr PgfAbsCat)) (Ptr GuSeq) (Map.Map String (Ptr PgfAbsFun)) (Ptr PgfAbsFun) Touch
|
data AbstrInfo = AbstrInfo (Ptr GuSeq) (Ptr GuSeq) (Map.Map String (Ptr PgfAbsCat)) (Ptr GuSeq) (Map.Map String (Ptr PgfAbsFun)) (Ptr PgfAbsFun) (Ptr GuBuf) Touch
|
||||||
|
|
||||||
newAbstr :: (?builder :: Builder s) => [(String,Literal)] ->
|
newAbstr :: (?builder :: Builder s) => [(String,Literal)] ->
|
||||||
[(Cat,[B s Hypo],Float)] ->
|
[(Cat,[B s Hypo],Float)] ->
|
||||||
@@ -465,7 +466,8 @@ newAbstr aflags cats funs = unsafePerformIO $ do
|
|||||||
(c_cats,abscats) <- newAbsCats (sortByFst3 cats) pool
|
(c_cats,abscats) <- newAbsCats (sortByFst3 cats) pool
|
||||||
(c_funs,absfuns) <- newAbsFuns (sortByFst4 funs) pool
|
(c_funs,absfuns) <- newAbsFuns (sortByFst4 funs) pool
|
||||||
c_abs_lin_fun <- newAbsLinFun
|
c_abs_lin_fun <- newAbsLinFun
|
||||||
return (AbstrInfo c_aflags c_cats abscats c_funs absfuns c_abs_lin_fun touch)
|
c_non_lexical_buf <- gu_make_buf (#size PgfProductionIdxEntry) pool
|
||||||
|
return (AbstrInfo c_aflags c_cats abscats c_funs absfuns c_abs_lin_fun c_non_lexical_buf touch)
|
||||||
where
|
where
|
||||||
(Builder pool touch) = ?builder
|
(Builder pool touch) = ?builder
|
||||||
|
|
||||||
@@ -531,7 +533,7 @@ newAbstr aflags cats funs = unsafePerformIO $ do
|
|||||||
return ptr
|
return ptr
|
||||||
|
|
||||||
|
|
||||||
data ConcrInfo = ConcrInfo (Ptr GuSeq) (Ptr GuMap) (Ptr GuMap) (Ptr GuSeq) (Ptr GuSeq) (Ptr GuMap)
|
data ConcrInfo = ConcrInfo (Ptr GuSeq) (Ptr GuMap) (Ptr GuMap) (Ptr GuSeq) (Ptr GuSeq) (Ptr GuMap) (Ptr PgfConcr -> Ptr GuPool -> IO ()) CInt
|
||||||
|
|
||||||
newConcr :: (?builder :: Builder s) => AbstrInfo ->
|
newConcr :: (?builder :: Builder s) => AbstrInfo ->
|
||||||
[(String,Literal)] -> -- ^ Concrete syntax flags
|
[(String,Literal)] -> -- ^ Concrete syntax flags
|
||||||
@@ -542,8 +544,9 @@ newConcr :: (?builder :: Builder s) => AbstrInfo ->
|
|||||||
[(Fun,[SeqId])] -> -- ^ Concrete functions (must be sorted by Fun)
|
[(Fun,[SeqId])] -> -- ^ Concrete functions (must be sorted by Fun)
|
||||||
[[Symbol]] -> -- ^ Sequences (must be sorted)
|
[[Symbol]] -> -- ^ Sequences (must be sorted)
|
||||||
[(Cat,FId,FId,[String])] -> -- ^ Concrete categories
|
[(Cat,FId,FId,[String])] -> -- ^ Concrete categories
|
||||||
|
FId -> -- ^ The total count of the categories
|
||||||
ConcrInfo
|
ConcrInfo
|
||||||
newConcr (AbstrInfo _ _ abscats _ absfuns c_abs_lin_fun _) cflags printnames lindefs linrefs prods cncfuns sequences cnccats = unsafePerformIO $ do
|
newConcr (AbstrInfo _ _ abscats _ absfuns c_abs_lin_fun c_non_lexical_buf _) cflags printnames lindefs linrefs prods cncfuns sequences cnccats total_cats = unsafePerformIO $ do
|
||||||
c_cflags <- newFlags cflags pool
|
c_cflags <- newFlags cflags pool
|
||||||
c_printname <- newMap (#size GuString) gu_string_hasher newUtf8CString
|
c_printname <- newMap (#size GuString) gu_string_hasher newUtf8CString
|
||||||
(#size GuString) (pokeString pool)
|
(#size GuString) (pokeString pool)
|
||||||
@@ -558,9 +561,9 @@ newConcr (AbstrInfo _ _ abscats _ absfuns c_abs_lin_fun _) cflags printnames li
|
|||||||
pool
|
pool
|
||||||
mapM_ (addLindefs c_ccats funs_ptr) lindefs
|
mapM_ (addLindefs c_ccats funs_ptr) lindefs
|
||||||
mapM_ (addLinrefs c_ccats funs_ptr) linrefs
|
mapM_ (addLinrefs c_ccats funs_ptr) linrefs
|
||||||
mapM_ (addProductions c_ccats funs_ptr) prods
|
mk_index <- foldM (addProductions c_ccats funs_ptr c_non_lexical_buf) (\concr pool -> return ()) prods
|
||||||
c_cnccats <- newMap (#size GuString) gu_string_hasher newUtf8CString (#size PgfCncCat*) (pokeCncCat c_ccats) (map (\v@(k,_,_,_) -> (k,v)) cnccats) pool
|
c_cnccats <- newMap (#size GuString) gu_string_hasher newUtf8CString (#size PgfCncCat*) (pokeCncCat c_ccats) (map (\v@(k,_,_,_) -> (k,v)) cnccats) pool
|
||||||
return (ConcrInfo c_cflags c_printname c_ccats c_cncfuns c_seqs c_cnccats)
|
return (ConcrInfo c_cflags c_printname c_ccats c_cncfuns c_seqs c_cnccats mk_index (fromIntegral total_cats))
|
||||||
where
|
where
|
||||||
(Builder pool touch) = ?builder
|
(Builder pool touch) = ?builder
|
||||||
|
|
||||||
@@ -575,20 +578,34 @@ newConcr (AbstrInfo _ _ abscats _ absfuns c_abs_lin_fun _) cflags printnames li
|
|||||||
|
|
||||||
addLindefs c_ccats funs_ptr (fid,funids) = do
|
addLindefs c_ccats funs_ptr (fid,funids) = do
|
||||||
c_ccat <- getCCat c_ccats fid pool
|
c_ccat <- getCCat c_ccats fid pool
|
||||||
c_funs <- newSequence (#size PgfCncFun*) (pokeFunId funs_ptr) funids pool
|
c_funs <- newSequence (#size PgfCncFun*) (pokeRefDefFunId funs_ptr) funids pool
|
||||||
(#poke PgfCCat, lindefs) c_ccat c_funs
|
(#poke PgfCCat, lindefs) c_ccat c_funs
|
||||||
|
|
||||||
addLinrefs c_ccats funs_ptr (fid,funids) = do
|
addLinrefs c_ccats funs_ptr (fid,funids) = do
|
||||||
c_ccat <- getCCat c_ccats fid pool
|
c_ccat <- getCCat c_ccats fid pool
|
||||||
c_funs <- newSequence (#size PgfCncFun*) (pokeFunId funs_ptr) funids pool
|
c_funs <- newSequence (#size PgfCncFun*) (pokeRefDefFunId funs_ptr) funids pool
|
||||||
(#poke PgfCCat, linrefs) c_ccat c_funs
|
(#poke PgfCCat, linrefs) c_ccat c_funs
|
||||||
|
|
||||||
addProductions c_ccats funs_ptr (fid,prods) = do
|
addProductions c_ccats funs_ptr c_non_lexical_buf mk_index (fid,prods) = do
|
||||||
c_ccat <- getCCat c_ccats fid pool
|
c_ccat <- getCCat c_ccats fid pool
|
||||||
c_prods <- gu_make_seq (#size PgfProduction) (fromIntegral (length prods)) pool
|
let n_prods = length prods
|
||||||
|
c_prods <- gu_make_seq (#size PgfProduction) (fromIntegral n_prods) pool
|
||||||
(#poke PgfCCat, prods) c_ccat c_prods
|
(#poke PgfCCat, prods) c_ccat c_prods
|
||||||
|
pokeProductions c_ccat (c_prods `plusPtr` (#offset GuSeq, data)) 0 (n_prods-1) mk_index prods
|
||||||
|
where
|
||||||
|
pokeProductions c_ccat ptr top bot mk_index [] = return mk_index
|
||||||
|
pokeProductions c_ccat ptr top bot mk_index (prod:prods) = do
|
||||||
|
(is_lexical,c_prod) <- newProduction c_ccats funs_ptr c_non_lexical_buf prod pool
|
||||||
|
let mk_index' = \concr pool -> do pgf_parser_index concr c_ccat c_prod is_lexical pool
|
||||||
|
pgf_lzr_index concr c_ccat c_prod is_lexical pool
|
||||||
|
mk_index concr pool
|
||||||
|
if is_lexical == 0
|
||||||
|
then do poke (ptr `plusPtr` ((#size PgfProduction)*top)) c_prod
|
||||||
|
pokeProductions c_ccat ptr (top+1) bot mk_index' prods
|
||||||
|
else do poke (ptr `plusPtr` ((#size PgfProduction)*bot)) c_prod
|
||||||
|
pokeProductions c_ccat ptr top (bot-1) mk_index' prods
|
||||||
|
|
||||||
pokeFunId funs_ptr ptr funid = do
|
pokeRefDefFunId funs_ptr ptr funid = do
|
||||||
let c_fun = funs_ptr `plusPtr` (funid * (#size PgfCncFun))
|
let c_fun = funs_ptr `plusPtr` (funid * (#size PgfCncFun))
|
||||||
(#poke PgfCncFun, absfun) c_fun c_abs_lin_fun
|
(#poke PgfCncFun, absfun) c_fun c_abs_lin_fun
|
||||||
poke ptr c_fun
|
poke ptr c_fun
|
||||||
@@ -622,7 +639,7 @@ newPGF :: (?builder :: Builder s) => [(String,Literal)] ->
|
|||||||
AbstrInfo ->
|
AbstrInfo ->
|
||||||
[(ConcName,ConcrInfo)] ->
|
[(ConcName,ConcrInfo)] ->
|
||||||
B s PGF
|
B s PGF
|
||||||
newPGF gflags absname (AbstrInfo c_aflags c_cats _ c_funs _ c_abs_lin_fun _) concrs =
|
newPGF gflags absname (AbstrInfo c_aflags c_cats _ c_funs _ c_abs_lin_fun _ _) concrs =
|
||||||
unsafePerformIO $ do
|
unsafePerformIO $ do
|
||||||
ptr <- gu_malloc_aligned pool
|
ptr <- gu_malloc_aligned pool
|
||||||
(#size PgfPGF)
|
(#size PgfPGF)
|
||||||
@@ -645,17 +662,29 @@ newPGF gflags absname (AbstrInfo c_aflags c_cats _ c_funs _ c_abs_lin_fun _) con
|
|||||||
where
|
where
|
||||||
(Builder pool touch) = ?builder
|
(Builder pool touch) = ?builder
|
||||||
|
|
||||||
pokeConcr c_abstr ptr (name, ConcrInfo c_cflags c_printnames c_ccats c_cncfuns c_seqs c_cnccats) = do
|
pokeConcr c_abstr ptr (name, ConcrInfo c_cflags c_printnames c_ccats c_cncfuns c_seqs c_cnccats mk_index c_total_cats) = do
|
||||||
c_name <- newUtf8CString name pool
|
c_name <- newUtf8CString name pool
|
||||||
|
c_fun_indices <- gu_make_map (#size GuString) gu_string_hasher
|
||||||
|
(#size PgfCncOverloadMap*) gu_null_struct
|
||||||
|
(#const GU_MAP_DEFAULT_INIT_SIZE)
|
||||||
|
pool
|
||||||
|
c_coerce_idx <- gu_make_map (#size PgfCCat*) gu_addr_hasher
|
||||||
|
(#size GuBuf*) gu_null_struct
|
||||||
|
(#const GU_MAP_DEFAULT_INIT_SIZE)
|
||||||
|
pool
|
||||||
(#poke PgfConcr, name) ptr c_name
|
(#poke PgfConcr, name) ptr c_name
|
||||||
(#poke PgfConcr, abstr) ptr c_abstr
|
(#poke PgfConcr, abstr) ptr c_abstr
|
||||||
(#poke PgfConcr, cflags) ptr c_cflags
|
(#poke PgfConcr, cflags) ptr c_cflags
|
||||||
(#poke PgfConcr, printnames) ptr c_printnames
|
(#poke PgfConcr, printnames) ptr c_printnames
|
||||||
(#poke PgfConcr, ccats) ptr c_ccats
|
(#poke PgfConcr, ccats) ptr c_ccats
|
||||||
|
(#poke PgfConcr, fun_indices) ptr c_fun_indices
|
||||||
|
(#poke PgfConcr, coerce_idx) ptr c_coerce_idx
|
||||||
(#poke PgfConcr, cncfuns) ptr c_cncfuns
|
(#poke PgfConcr, cncfuns) ptr c_cncfuns
|
||||||
(#poke PgfConcr, sequences) ptr c_seqs
|
(#poke PgfConcr, sequences) ptr c_seqs
|
||||||
(#poke PgfConcr, cnccats) ptr c_cnccats
|
(#poke PgfConcr, cnccats) ptr c_cnccats
|
||||||
|
(#poke PgfConcr, total_cats) ptr c_total_cats
|
||||||
(#poke PgfConcr, pool) ptr nullPtr
|
(#poke PgfConcr, pool) ptr nullPtr
|
||||||
|
mk_index ptr pool
|
||||||
|
|
||||||
|
|
||||||
newFlags :: [(String,Literal)] -> Ptr GuPool -> IO (Ptr GuSeq)
|
newFlags :: [(String,Literal)] -> Ptr GuPool -> IO (Ptr GuSeq)
|
||||||
@@ -667,6 +696,7 @@ newFlags flags pool = newSequence (#size PgfFlag) pokeFlag (sortByFst flags) poo
|
|||||||
(#poke PgfFlag, name) c_flag c_name
|
(#poke PgfFlag, name) c_flag c_name
|
||||||
(#poke PgfFlag, value) c_flag c_value
|
(#poke PgfFlag, value) c_flag c_value
|
||||||
|
|
||||||
|
|
||||||
newLiteral :: Literal -> Ptr GuPool -> IO GuVariant
|
newLiteral :: Literal -> Ptr GuPool -> IO GuVariant
|
||||||
newLiteral (LStr val) pool =
|
newLiteral (LStr val) pool =
|
||||||
alloca $ \pptr -> do
|
alloca $ \pptr -> do
|
||||||
@@ -693,6 +723,44 @@ newLiteral (LFlt val) pool =
|
|||||||
(#poke PgfLiteralFlt, val) ptr (realToFrac val :: CDouble)
|
(#poke PgfLiteralFlt, val) ptr (realToFrac val :: CDouble)
|
||||||
peek pptr
|
peek pptr
|
||||||
|
|
||||||
|
|
||||||
|
newProduction :: Ptr GuMap -> Ptr PgfCncFun -> Ptr GuBuf -> Production -> Ptr GuPool -> IO ((#type bool), GuVariant)
|
||||||
|
newProduction c_ccats funs_ptr c_non_lexical_buf (PApply fun_id args) pool =
|
||||||
|
alloca $ \pptr -> do
|
||||||
|
let c_fun = funs_ptr `plusPtr` (fun_id * (#size PgfCncFun))
|
||||||
|
c_args <- newSequence (#size PgfPArg) pokePArg args pool
|
||||||
|
ptr <- gu_alloc_variant (#const PGF_PRODUCTION_APPLY)
|
||||||
|
(fromIntegral (#size PgfProductionApply))
|
||||||
|
(#const gu_alignof(PgfProductionApply))
|
||||||
|
pptr pool
|
||||||
|
(#poke PgfProductionApply, fun) ptr c_fun
|
||||||
|
(#poke PgfProductionApply, args) ptr c_args
|
||||||
|
is_lexical <- pgf_production_is_lexical ptr c_non_lexical_buf pool
|
||||||
|
c_prod <- peek pptr
|
||||||
|
return (is_lexical,c_prod)
|
||||||
|
where
|
||||||
|
pokePArg ptr (PArg hypos ccat) = do
|
||||||
|
c_ccat <- getCCat c_ccats ccat pool
|
||||||
|
(#poke PgfPArg, ccat) ptr c_ccat
|
||||||
|
c_hypos <- newSequence (#size PgfCCat*) pokeCCat hypos pool
|
||||||
|
(#poke PgfPArg, hypos) ptr c_hypos
|
||||||
|
|
||||||
|
pokeCCat ptr ccat = do
|
||||||
|
c_ccat <- getCCat c_ccats ccat pool
|
||||||
|
poke ptr c_ccat
|
||||||
|
|
||||||
|
newProduction c_ccats funs_ptr c_non_lexical_buf (PCoerce fid) pool =
|
||||||
|
alloca $ \pptr -> do
|
||||||
|
ptr <- gu_alloc_variant (#const PGF_PRODUCTION_COERCE)
|
||||||
|
(fromIntegral (#size PgfProductionCoerce))
|
||||||
|
(#const gu_alignof(PgfProductionCoerce))
|
||||||
|
pptr pool
|
||||||
|
c_ccat <- getCCat c_ccats fid pool
|
||||||
|
(#poke PgfProductionCoerce, coerce) ptr c_ccat
|
||||||
|
c_prod <- peek pptr
|
||||||
|
return (0,c_prod)
|
||||||
|
|
||||||
|
|
||||||
newCncFun absfuns seqs_ptr (funid,(fun,seqids)) pool =
|
newCncFun absfuns seqs_ptr (funid,(fun,seqids)) pool =
|
||||||
do let c_absfun = fromMaybe nullPtr (Map.lookup fun absfuns)
|
do let c_absfun = fromMaybe nullPtr (Map.lookup fun absfuns)
|
||||||
c_ep = if c_absfun == nullPtr
|
c_ep = if c_absfun == nullPtr
|
||||||
|
|||||||
Reference in New Issue
Block a user