mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-09-17 07:46:00 -06:00
a first draft of an API for collaborative editing
This commit is contained in:
@@ -1605,6 +1605,38 @@ void PgfParser::print_expr_state(PgfMarshaller *m, ExprState *estate)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
PgfText *PgfParser::get_text() {
|
||||||
|
return sentence;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PgfParser::change(size_t start, size_t end, PgfText *change)
|
||||||
|
{
|
||||||
|
if (start > sentence->size || end > sentence->size || start > end)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
size_t new_size = sentence->size + change->size - (end-start);
|
||||||
|
|
||||||
|
if (sentence->size < new_size) {
|
||||||
|
PgfText *new_sentence = (PgfText *) realloc(sentence, sizeof(PgfText)+new_size+1);
|
||||||
|
if (new_sentence == NULL)
|
||||||
|
return false;
|
||||||
|
sentence = new_sentence;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&sentence->text[start+change->size], &sentence->text[end], sentence->size-end);
|
||||||
|
memcpy(&sentence->text[start], change->text, change->size);
|
||||||
|
|
||||||
|
if (sentence->size > new_size) {
|
||||||
|
PgfText *new_sentence = (PgfText *) realloc(sentence, sizeof(PgfText)+new_size+1);
|
||||||
|
if (new_sentence == NULL)
|
||||||
|
return false;
|
||||||
|
sentence = new_sentence;
|
||||||
|
}
|
||||||
|
|
||||||
|
sentence->size = new_size;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
PgfParseTableMaker::PgfParseTableMaker(ref<PgfConcr> concr)
|
PgfParseTableMaker::PgfParseTableMaker(ref<PgfConcr> concr)
|
||||||
: PgfAbstractParser(concr)
|
: PgfAbstractParser(concr)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ public:
|
|||||||
virtual ~PgfAbstractParser();
|
virtual ~PgfAbstractParser();
|
||||||
};
|
};
|
||||||
|
|
||||||
class PGF_INTERNAL_DECL PgfParser : private PgfAbstractParser, public PgfExprEnum
|
class PGF_INTERNAL_DECL PgfParser : private PgfAbstractParser, public PgfExprEnum, public PgfParseChart
|
||||||
{
|
{
|
||||||
PgfMarshaller *m;
|
PgfMarshaller *m;
|
||||||
PgfUnmarshaller *u;
|
PgfUnmarshaller *u;
|
||||||
@@ -314,7 +314,10 @@ public:
|
|||||||
|
|
||||||
void prepare(ref<PgfConcrLincat> start);
|
void prepare(ref<PgfConcrLincat> start);
|
||||||
|
|
||||||
PgfExpr fetch(PgfDB *db, prob_t *prob);
|
virtual PgfExpr fetch(PgfDB *db, prob_t *prob);
|
||||||
|
|
||||||
|
virtual PgfText *get_text();
|
||||||
|
virtual bool change(size_t start, size_t end, PgfText *change);
|
||||||
};
|
};
|
||||||
|
|
||||||
class PGF_INTERNAL_DECL PgfParseTableMaker : private PgfAbstractParser
|
class PGF_INTERNAL_DECL PgfParseTableMaker : private PgfAbstractParser
|
||||||
|
|||||||
@@ -2757,6 +2757,38 @@ void pgf_free_expr_enum(PgfExprEnum *en)
|
|||||||
delete en;
|
delete en;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PGF_API
|
||||||
|
PgfParseChart *pgf_parse_chart(PgfDB *db, PgfConcrRevision revision,
|
||||||
|
PgfType ty, PgfMarshaller *m, PgfUnmarshaller *u,
|
||||||
|
PgfText *sentence,
|
||||||
|
PgfExn * err)
|
||||||
|
{
|
||||||
|
PGF_API_BEGIN {
|
||||||
|
DB_scope scope(db, READER_SCOPE);
|
||||||
|
|
||||||
|
ref<PgfConcr> concr = db->revision2concr(revision);
|
||||||
|
|
||||||
|
bool case_sensitive = pgf_is_case_sensitive(concr);
|
||||||
|
|
||||||
|
PgfLincatUnmarshaller lincat_u(concr);
|
||||||
|
m->match_type(&lincat_u, ty);
|
||||||
|
if (lincat_u.lincat == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
PgfParser *parser = new PgfParser(concr, sentence, case_sensitive, m, u);
|
||||||
|
parser->prepare(lincat_u.lincat);
|
||||||
|
return parser;
|
||||||
|
} PGF_API_END
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PGF_API
|
||||||
|
void pgf_free_parse_chart(PgfParseChart *chart)
|
||||||
|
{
|
||||||
|
delete chart;
|
||||||
|
}
|
||||||
|
|
||||||
PGF_API
|
PGF_API
|
||||||
PgfText *pgf_get_printname(PgfDB *db, PgfConcrRevision revision,
|
PgfText *pgf_get_printname(PgfDB *db, PgfConcrRevision revision,
|
||||||
PgfText *fun, PgfExn* err)
|
PgfText *fun, PgfExn* err)
|
||||||
|
|||||||
@@ -830,6 +830,33 @@ PgfExprEnum *pgf_parse(PgfDB *db, PgfConcrRevision revision,
|
|||||||
PGF_API_DECL
|
PGF_API_DECL
|
||||||
void pgf_free_expr_enum(PgfExprEnum *en);
|
void pgf_free_expr_enum(PgfExprEnum *en);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
struct PgfParseChart {
|
||||||
|
virtual PgfText *get_text()=0;
|
||||||
|
virtual bool change(size_t start, size_t end, PgfText *change)=0;
|
||||||
|
virtual ~PgfParseChart() {};
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
typedef struct PgfParseChart PgfParseChart;
|
||||||
|
typedef struct PgfParseChartVtbl PgfParseChartVtbl;
|
||||||
|
struct PgfParseChartVtbl {
|
||||||
|
PgfText *(*get_text)(PgfParseChart *this);
|
||||||
|
int (*change)(PgfParseChart *this, size_t start, size_t end, PgfText *change);
|
||||||
|
};
|
||||||
|
struct PgfParseChart {
|
||||||
|
PgfParseChartVtbl *vtbl;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PGF_API_DECL
|
||||||
|
PgfParseChart *pgf_parse_chart(PgfDB *db, PgfConcrRevision revision,
|
||||||
|
PgfType ty, PgfMarshaller *m, PgfUnmarshaller *u,
|
||||||
|
PgfText *sentence,
|
||||||
|
PgfExn * err);
|
||||||
|
|
||||||
|
PGF_API_DECL
|
||||||
|
void pgf_free_parse_chart(PgfParseChart *chart);
|
||||||
|
|
||||||
PGF_API_DECL
|
PGF_API_DECL
|
||||||
PgfText *pgf_get_printname(PgfDB *db, PgfConcrRevision revision,
|
PgfText *pgf_get_printname(PgfDB *db, PgfConcrRevision revision,
|
||||||
PgfText *fun, PgfExn* err);
|
PgfText *fun, PgfExn* err);
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ module PGF2 (-- * PGF
|
|||||||
|
|
||||||
-- ** Parsing
|
-- ** Parsing
|
||||||
ParseOutput(..), parse, parseWithHeuristics, complete,
|
ParseOutput(..), parse, parseWithHeuristics, complete,
|
||||||
|
parseChart, getParseChartText, changeParseChartText,
|
||||||
|
|
||||||
-- * Exceptions
|
-- * Exceptions
|
||||||
PGFError(..),
|
PGFError(..),
|
||||||
@@ -872,6 +873,36 @@ enumerateExprs c_db c_revision c_enum_ptr = do
|
|||||||
rest <- unsafeInterleaveIO (fetchLazy c_fetch c_enum)
|
rest <- unsafeInterleaveIO (fetchLazy c_fetch c_enum)
|
||||||
return ((expr,prob) : rest)
|
return ((expr,prob) : rest)
|
||||||
|
|
||||||
|
data ParseChart = ParseChart {ch_db :: Ptr PgfDB,
|
||||||
|
ch_revision :: ForeignPtr Concr,
|
||||||
|
ch_chart :: ForeignPtr PgfParseChart
|
||||||
|
}
|
||||||
|
|
||||||
|
parseChart :: Concr -> Type -> String -> IO ParseChart
|
||||||
|
parseChart c ty sent =
|
||||||
|
withForeignPtr (c_revision c) $ \c_revision_ptr ->
|
||||||
|
bracket (newStablePtr ty) freeStablePtr $ \c_ty ->
|
||||||
|
withText sent $ \c_sent -> do
|
||||||
|
c_chart <- withPgfExn "parseChart" (pgf_parse_chart (c_db c) c_revision_ptr c_ty marshaller unmarshaller c_sent)
|
||||||
|
fptr <- newForeignPtr pgf_free_parse_chart c_chart
|
||||||
|
return (ParseChart (c_db c) (c_revision c) fptr)
|
||||||
|
|
||||||
|
getParseChartText :: ParseChart -> IO String
|
||||||
|
getParseChartText (ParseChart c_db c_revision c_chart) =
|
||||||
|
withForeignPtr c_chart $ \c_chart_ptr -> do
|
||||||
|
c_get_text <- (#peek PgfParseChartVtbl, get_text) =<< (#peek PgfParseChart, vtbl) c_chart_ptr
|
||||||
|
c_text <- callGetText c_get_text c_chart_ptr
|
||||||
|
peekText c_text
|
||||||
|
|
||||||
|
changeParseChartText :: ParseChart -> CSize -> CSize -> String -> IO Bool
|
||||||
|
changeParseChartText (ParseChart c_db c_revision c_chart) start end text =
|
||||||
|
withForeignPtr c_revision $ \_ ->
|
||||||
|
withForeignPtr c_chart $ \c_chart_ptr ->
|
||||||
|
withText text $ \c_text -> do
|
||||||
|
c_change <- (#peek PgfParseChartVtbl, change) =<< (#peek PgfParseChart, vtbl) c_chart_ptr
|
||||||
|
c_res <- callChange c_change c_chart_ptr start end c_text
|
||||||
|
return (c_res /= 0)
|
||||||
|
|
||||||
parseWithHeuristics :: Concr -- ^ the language with which we parse
|
parseWithHeuristics :: Concr -- ^ the language with which we parse
|
||||||
-> Type -- ^ the start category
|
-> Type -- ^ the start category
|
||||||
-> String -- ^ the input sentence
|
-> String -- ^ the input sentence
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ data PgfProbsCallback
|
|||||||
data PgfMorphoCallback
|
data PgfMorphoCallback
|
||||||
data PgfCohortsCallback
|
data PgfCohortsCallback
|
||||||
data PgfExprEnum
|
data PgfExprEnum
|
||||||
|
data PgfParseChart
|
||||||
data PgfAlignmentPhrase
|
data PgfAlignmentPhrase
|
||||||
data PgfParseTableMaker
|
data PgfParseTableMaker
|
||||||
|
|
||||||
@@ -284,9 +285,17 @@ foreign import ccall pgf_align_words :: Ptr PgfDB -> Ptr Concr -> StablePtr Expr
|
|||||||
|
|
||||||
foreign import ccall pgf_parse :: Ptr PgfDB -> Ptr Concr -> StablePtr Type -> Ptr PgfMarshaller -> Ptr PgfUnmarshaller -> Ptr PgfText -> Ptr PgfExn -> IO (Ptr PgfExprEnum)
|
foreign import ccall pgf_parse :: Ptr PgfDB -> Ptr Concr -> StablePtr Type -> Ptr PgfMarshaller -> Ptr PgfUnmarshaller -> Ptr PgfText -> Ptr PgfExn -> IO (Ptr PgfExprEnum)
|
||||||
|
|
||||||
|
foreign import ccall "&pgf_free_expr_enum" pgf_free_expr_enum :: FunPtr (Ptr PgfExprEnum -> IO ())
|
||||||
|
|
||||||
foreign import ccall "dynamic" callFetch :: Dynamic (Ptr PgfExprEnum -> Ptr PgfDB -> Ptr (#type prob_t) -> IO (StablePtr Expr))
|
foreign import ccall "dynamic" callFetch :: Dynamic (Ptr PgfExprEnum -> Ptr PgfDB -> Ptr (#type prob_t) -> IO (StablePtr Expr))
|
||||||
|
|
||||||
foreign import ccall "&pgf_free_expr_enum" pgf_free_expr_enum :: FunPtr (Ptr PgfExprEnum -> IO ())
|
foreign import ccall pgf_parse_chart :: Ptr PgfDB -> Ptr Concr -> StablePtr Type -> Ptr PgfMarshaller -> Ptr PgfUnmarshaller -> Ptr PgfText -> Ptr PgfExn -> IO (Ptr PgfParseChart)
|
||||||
|
|
||||||
|
foreign import ccall "&pgf_free_parse_chart" pgf_free_parse_chart :: FunPtr (Ptr PgfParseChart -> IO ())
|
||||||
|
|
||||||
|
foreign import ccall "dynamic" callGetText :: Dynamic (Ptr PgfParseChart -> IO (Ptr PgfText))
|
||||||
|
|
||||||
|
foreign import ccall "dynamic" callChange :: Dynamic (Ptr PgfParseChart -> CSize -> CSize -> Ptr PgfText -> IO CInt)
|
||||||
|
|
||||||
foreign import ccall "wrapper" wrapSymbol0 :: Wrapper (Ptr PgfLinearizationOutputIface -> IO ())
|
foreign import ccall "wrapper" wrapSymbol0 :: Wrapper (Ptr PgfLinearizationOutputIface -> IO ())
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user