mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-10-28 01:13:18 -06:00
Diophantine grammars in the runtime
This commit is contained in:
1 parent
cb1e67dffa
commit
cb6bace896
19 files changed
+3003
-3802
No files matched your search
+94
-110
@@ -1,138 +1,122 @@
|
||||
#ifndef PHRASETABLE_H
|
||||
#define PHRASETABLE_H
|
||||
|
||||
struct PgfSequence;
|
||||
struct PgfSequenceBackref;
|
||||
|
||||
struct PGF_INTERNAL_DECL PgfPhrasetableEntry {
|
||||
ref<PgfSequence> seq;
|
||||
|
||||
// Here n_backrefs tells us how many actual backrefs there are in
|
||||
// the vector backrefs. On the other hand, backrefs->len tells us
|
||||
// how big buffer we have allocated.
|
||||
size_t n_backrefs;
|
||||
vector<PgfSequenceBackref> backrefs;
|
||||
};
|
||||
|
||||
struct PgfSequenceItor;
|
||||
typedef ref<Node<PgfPhrasetableEntry>> PgfPhrasetable;
|
||||
|
||||
|
||||
#if __GNUC__
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wattributes"
|
||||
#endif
|
||||
|
||||
struct PgfPhrasetableIds {
|
||||
public:
|
||||
PGF_INTERNAL_DECL PgfPhrasetableIds();
|
||||
PGF_INTERNAL_DECL ~PgfPhrasetableIds() { end(); }
|
||||
|
||||
PGF_INTERNAL_DECL void start(ref<PgfConcr> concr);
|
||||
PGF_INTERNAL_DECL size_t add(ref<PgfSequence> seq);
|
||||
PGF_INTERNAL_DECL size_t get(ref<PgfSequence> seq);
|
||||
PGF_INTERNAL_DECL void end();
|
||||
|
||||
private:
|
||||
size_t next_id;
|
||||
|
||||
struct PGF_INTERNAL_DECL SeqIdChain;
|
||||
|
||||
struct PGF_INTERNAL_DECL SeqIdPair {
|
||||
SeqIdChain *chain;
|
||||
ref<PgfSequence> seq;
|
||||
size_t seq_id;
|
||||
};
|
||||
|
||||
struct PGF_INTERNAL_DECL SeqIdChain : public SeqIdPair {
|
||||
SeqIdChain *next;
|
||||
};
|
||||
|
||||
size_t n_pairs;
|
||||
SeqIdPair *pairs;
|
||||
SeqIdChain *chains;
|
||||
};
|
||||
|
||||
#if __GNUC__
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
struct PgfConcrLincat;
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
PgfPhrasetable phrasetable_internalize(PgfPhrasetable table,
|
||||
ref<PgfSequence> seq,
|
||||
ref<PgfConcrLincat> lincat,
|
||||
object container,
|
||||
size_t seq_index,
|
||||
ref<PgfPhrasetableEntry> *pentry);
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
ref<PgfSequence> phrasetable_relink(PgfPhrasetable table,
|
||||
object container,
|
||||
size_t seq_index,
|
||||
size_t seq_id);
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
PgfPhrasetable phrasetable_delete(PgfPhrasetable table,
|
||||
object container,
|
||||
size_t seq_index,
|
||||
ref<PgfSequence> seq);
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
size_t phrasetable_size(PgfPhrasetable table);
|
||||
|
||||
struct PgfConcrLin;
|
||||
struct PgfConcrLincat;
|
||||
|
||||
struct PGF_INTERNAL_DECL PgfTextSpot {
|
||||
size_t pos; // position in Unicode characters
|
||||
const uint8_t *ptr; // pointer into the spot location
|
||||
};
|
||||
|
||||
struct PGF_INTERNAL_DECL PgfItem {
|
||||
struct {
|
||||
size_t &operator[](int i) {
|
||||
PgfItem *item = containerof(PgfItem,vars,this);
|
||||
return ((size_t*) (((ref<PgfSymbolCCat>*) (item+1))+item->rule->args.size()))[i];
|
||||
}
|
||||
size_t size() {
|
||||
PgfItem *item = containerof(PgfItem,vars,this);
|
||||
return (item->rule->vars != 0) ? item->rule->vars.size() : 0;
|
||||
}
|
||||
} vars;
|
||||
|
||||
struct {
|
||||
ref<PgfSymbolCCat> &operator[](int i) {
|
||||
PgfItem *item = containerof(PgfItem,args,this);
|
||||
return ((ref<PgfSymbolCCat>*) (item+1))[i];
|
||||
}
|
||||
size_t size() {
|
||||
PgfItem *item = containerof(PgfItem,args,this);
|
||||
return item->rule->args.size();
|
||||
}
|
||||
} args;
|
||||
|
||||
uint16_t pre_alt;
|
||||
uint16_t pre_dot;
|
||||
uint16_t dot;
|
||||
ref<PgfConcrRule> rule;
|
||||
};
|
||||
|
||||
struct PgfPhrasetableNode;
|
||||
typedef ref<PgfPhrasetableNode> PgfPhrasetable;
|
||||
|
||||
struct PGF_INTERNAL_DECL PgfPhrasetableNode {
|
||||
const static size_t DELTA = 3;
|
||||
const static size_t RATIO = 2;
|
||||
|
||||
public:
|
||||
PgfSymbol sym;
|
||||
|
||||
// Here n_items tells us how many actual items there are in
|
||||
// the vector items. On the other hand, items.size() tells us
|
||||
// how big buffer we have allocated.
|
||||
size_t n_items;
|
||||
vector<ref<PgfItem>> items;
|
||||
|
||||
txn_t txn_id;
|
||||
|
||||
size_t sz;
|
||||
ref<PgfPhrasetableNode> left;
|
||||
ref<PgfPhrasetableNode> right;
|
||||
|
||||
static
|
||||
ref<PgfPhrasetableNode> new_node(PgfSymbol sym, size_t n_items);
|
||||
|
||||
static
|
||||
ref<PgfPhrasetableNode> upd_node(ref<PgfPhrasetableNode> node, ref<PgfPhrasetableNode> left, ref<PgfPhrasetableNode> right);
|
||||
|
||||
static
|
||||
ref<PgfPhrasetableNode> balanceL(ref<PgfPhrasetableNode> node);
|
||||
|
||||
static
|
||||
ref<PgfPhrasetableNode> balanceR(ref<PgfPhrasetableNode> node);
|
||||
|
||||
static
|
||||
size_t size(ref<PgfPhrasetableNode> node)
|
||||
{
|
||||
if (node == 0)
|
||||
return 0;
|
||||
return node->sz;
|
||||
}
|
||||
|
||||
static
|
||||
void release(ref<PgfPhrasetableNode> node);
|
||||
};
|
||||
|
||||
PgfPhrasetable phrasetable_insert(PgfPhrasetable table,
|
||||
PgfSymbol sym,
|
||||
ref<PgfItem> item);
|
||||
|
||||
PgfPhrasetable phrasetable_insert(PgfPhrasetable table,
|
||||
ref<PgfConcrLincat> lincat,
|
||||
size_t value, size_t lin_idx,
|
||||
ref<PgfItem> item);
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
void phrasetable_iter(PgfPhrasetable phrasetable,ref<PgfConcrLincat> lincat,std::function<void(ref<PgfSymbolCCat> symcf,size_t,vector<ref<PgfItem>>)> &f);
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
vector<ref<PgfItem>> phrasetable_lookup(PgfPhrasetable phrasetable, PgfSymbol sym, size_t *n_items);
|
||||
|
||||
class PGF_INTERNAL_DECL PgfPhraseScanner {
|
||||
public:
|
||||
virtual void space(PgfTextSpot *start, PgfTextSpot *end, PgfExn* err)=0;
|
||||
virtual void start_matches(PgfTextSpot *spot, PgfExn* err)=0;
|
||||
virtual void match(ref<PgfConcrLin> lin, size_t seq_index, PgfExn* err)=0;
|
||||
virtual void match(ref<PgfConcrLin> lin, size_t lin_idx, PgfExn* err)=0;
|
||||
virtual void end_matches(PgfTextSpot *spot, PgfExn* err)=0;
|
||||
};
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
void phrasetable_lookup(PgfPhrasetable table,
|
||||
void phrasetable_lookup(PgfPhrasetable phrasetable,
|
||||
PgfText *sentence,
|
||||
bool case_sensitive,
|
||||
PgfPhraseScanner *scanner, PgfExn* err);
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
void phrasetable_lookup_cohorts(PgfPhrasetable table,
|
||||
void phrasetable_lookup_cohorts(PgfPhrasetable phrasetable,
|
||||
PgfText *sentence,
|
||||
bool case_sensitive,
|
||||
PgfPhraseScanner *scanner, PgfExn* err);
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
void phrasetable_iter(PgfConcr *concr,
|
||||
PgfPhrasetable table,
|
||||
PgfSequenceItor* itor,
|
||||
PgfMorphoCallback *callback,
|
||||
PgfPhrasetableIds *seq_ids, PgfExn *err);
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
void phrasetable_release(PgfPhrasetable table);
|
||||
|
||||
// The following are used internally in the parser
|
||||
|
||||
enum SeqMatch { SM_FULL_MATCH, SM_PREFIX, SM_PARTIAL };
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
int text_sequence_cmp(PgfTextSpot *spot, const uint8_t *end,
|
||||
ref<PgfSequence> seq, size_t *p_i,
|
||||
bool case_sensitive, SeqMatch sm);
|
||||
|
||||
// The following is used internally in the grammar builder
|
||||
|
||||
PGF_INTERNAL_DECL
|
||||
void phrasetable_add_backref(ref<PgfPhrasetableEntry> entry, txn_t txn_id,
|
||||
object container,
|
||||
size_t seq_index);
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user