mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-09-17 15:56:01 -06:00
support parsing with literals
This commit is contained in:
@@ -95,7 +95,7 @@ cf2concr opts abstr cfg =
|
|||||||
|
|
||||||
mkSequence rule = snd $ mapAccumL convertSymbol 0 (ruleRhs rule)
|
mkSequence rule = snd $ mapAccumL convertSymbol 0 (ruleRhs rule)
|
||||||
where
|
where
|
||||||
convertSymbol d (NonTerminal (c,_)) = (d+1,if c `elem` ["Int","Float","String"] then SymLit d 0 else SymCat d 0)
|
convertSymbol d (NonTerminal (c,_)) = (d+1,SymCat d 0)
|
||||||
convertSymbol d (Terminal t) = (d, SymKS t)
|
convertSymbol d (Terminal t) = (d, SymKS t)
|
||||||
|
|
||||||
mkCncCat fid (cat,n)
|
mkCncCat fid (cat,n)
|
||||||
|
|||||||
@@ -386,14 +386,6 @@ compareCaseInsensitive (x:xs) (y:ys) =
|
|||||||
EQ -> r1 `compare` r2
|
EQ -> r1 `compare` r2
|
||||||
x -> x
|
x -> x
|
||||||
_ -> LT
|
_ -> LT
|
||||||
SymLit d1 r1
|
|
||||||
-> case s2 of
|
|
||||||
SymCat {} -> GT
|
|
||||||
SymLit d2 r2
|
|
||||||
-> case compare d1 d2 of
|
|
||||||
EQ -> r1 `compare` r2
|
|
||||||
x -> x
|
|
||||||
_ -> LT
|
|
||||||
SymVar d1 r1
|
SymVar d1 r1
|
||||||
-> if tagToEnum# (getTag s2 ># 2#)
|
-> if tagToEnum# (getTag s2 ># 2#)
|
||||||
then LT
|
then LT
|
||||||
|
|||||||
@@ -203,7 +203,6 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"SymCat",
|
"SymCat",
|
||||||
"SymLit",
|
|
||||||
"SymVar",
|
"SymVar",
|
||||||
"SymKS",
|
"SymKS",
|
||||||
"SymKP",
|
"SymKP",
|
||||||
|
|||||||
@@ -307,7 +307,6 @@ instance Binary Literal where
|
|||||||
|
|
||||||
instance Binary Symbol where
|
instance Binary Symbol where
|
||||||
put (SymCat d r) = putWord8 0 >> put (d,r)
|
put (SymCat d r) = putWord8 0 >> put (d,r)
|
||||||
put (SymLit d r) = putWord8 1 >> put (d,r)
|
|
||||||
put (SymVar n l) = putWord8 2 >> put (n,l)
|
put (SymVar n l) = putWord8 2 >> put (n,l)
|
||||||
put (SymKS ts) = putWord8 3 >> put ts
|
put (SymKS ts) = putWord8 3 >> put ts
|
||||||
put (SymKP d vs) = putWord8 4 >> put (d,vs)
|
put (SymKP d vs) = putWord8 4 >> put (d,vs)
|
||||||
@@ -320,7 +319,6 @@ instance Binary Symbol where
|
|||||||
get = do tag <- getWord8
|
get = do tag <- getWord8
|
||||||
case tag of
|
case tag of
|
||||||
0 -> liftM2 SymCat get get
|
0 -> liftM2 SymCat get get
|
||||||
1 -> liftM2 SymLit get get
|
|
||||||
2 -> liftM2 SymVar get get
|
2 -> liftM2 SymVar get get
|
||||||
3 -> liftM SymKS get
|
3 -> liftM SymKS get
|
||||||
4 -> liftM2 (\d vs -> SymKP d vs) get get
|
4 -> liftM2 (\d vs -> SymKP d vs) get get
|
||||||
|
|||||||
@@ -380,7 +380,6 @@ ppLit (LInt n) = pp n
|
|||||||
ppLit (LFlt d) = pp d
|
ppLit (LFlt d) = pp d
|
||||||
|
|
||||||
ppSymbol (SymCat d r)= pp '<' <> pp d <> pp ',' <> ppLParam r <> pp '>'
|
ppSymbol (SymCat d r)= pp '<' <> pp d <> pp ',' <> ppLParam r <> pp '>'
|
||||||
ppSymbol (SymLit d r)= pp '{' <> pp d <> pp ',' <> ppLParam r <> pp '}'
|
|
||||||
ppSymbol (SymVar d r) = pp '<' <> pp d <> pp ',' <> pp '$' <> pp r <> pp '>'
|
ppSymbol (SymVar d r) = pp '<' <> pp d <> pp ',' <> pp '$' <> pp r <> pp '>'
|
||||||
ppSymbol (SymKS t) = doubleQuotes (pp t)
|
ppSymbol (SymKS t) = doubleQuotes (pp t)
|
||||||
ppSymbol SymNE = pp "nonExist"
|
ppSymbol SymNE = pp "nonExist"
|
||||||
|
|||||||
@@ -78,11 +78,6 @@ static void symbols_release(vector<PgfSymbol> syms)
|
|||||||
PgfDB::free(sym_cat, sym_cat->r.n_terms*sizeof(sym_cat->r.terms[0]));
|
PgfDB::free(sym_cat, sym_cat->r.n_terms*sizeof(sym_cat->r.terms[0]));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PgfSymbolLit::tag: {
|
|
||||||
auto sym_lit = ref<PgfSymbolLit>::untagged(sym);
|
|
||||||
PgfDB::free(sym_lit, sym_lit->r.n_terms*sizeof(sym_lit->r.terms[0]));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PgfSymbolVar::tag:
|
case PgfSymbolVar::tag:
|
||||||
PgfDB::free(ref<PgfSymbolVar>::untagged(sym));
|
PgfDB::free(ref<PgfSymbolVar>::untagged(sym));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -159,12 +159,6 @@ struct PGF_INTERNAL_DECL PgfSymbolCat {
|
|||||||
PgfLParam r;
|
PgfLParam r;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PGF_INTERNAL_DECL PgfSymbolLit {
|
|
||||||
static const uint8_t tag = 1;
|
|
||||||
size_t d;
|
|
||||||
PgfLParam r;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PGF_INTERNAL_DECL PgfSymbolVar {
|
struct PGF_INTERNAL_DECL PgfSymbolVar {
|
||||||
static const uint8_t tag = 2;
|
static const uint8_t tag = 2;
|
||||||
size_t d, r;
|
size_t d, r;
|
||||||
|
|||||||
@@ -305,10 +305,10 @@ PgfType PgfInternalMarshaller::match_type(PgfUnmarshaller *u, PgfType ty)
|
|||||||
tp->exprs.size(), tp->exprs.get_data());
|
tp->exprs.size(), tp->exprs.get_data());
|
||||||
}
|
}
|
||||||
|
|
||||||
PgfExprParser::PgfExprParser(PgfText *input, PgfUnmarshaller *unmarshaller)
|
PgfExprParser::PgfExprParser(PgfText *input, size_t byte_pos, PgfUnmarshaller *unmarshaller)
|
||||||
{
|
{
|
||||||
inp = input;
|
inp = input;
|
||||||
pos = (const char*) &inp->text;
|
pos = (const char*) &inp->text[byte_pos];
|
||||||
ch = ' ';
|
ch = ' ';
|
||||||
u = unmarshaller;
|
u = unmarshaller;
|
||||||
token_pos = NULL;
|
token_pos = NULL;
|
||||||
@@ -354,11 +354,6 @@ void PgfExprParser::putc(uint32_t ucs)
|
|||||||
*(p++) = 0;
|
*(p++) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PgfExprParser::eof()
|
|
||||||
{
|
|
||||||
return (token_tag == PGF_TOKEN_EOF);
|
|
||||||
}
|
|
||||||
|
|
||||||
PGF_INTERNAL bool
|
PGF_INTERNAL bool
|
||||||
pgf_is_ident_first(uint32_t ucs)
|
pgf_is_ident_first(uint32_t ucs)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ class PGF_INTERNAL_DECL PgfExprParser {
|
|||||||
void putc(uint32_t ch);
|
void putc(uint32_t ch);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PgfExprParser(PgfText* input, PgfUnmarshaller *unmarshaller);
|
PgfExprParser(PgfText* input, size_t byte_pos, PgfUnmarshaller *unmarshaller);
|
||||||
~PgfExprParser();
|
~PgfExprParser();
|
||||||
|
|
||||||
bool str_char();
|
bool str_char();
|
||||||
@@ -189,8 +189,15 @@ public:
|
|||||||
PgfType parse_type();
|
PgfType parse_type();
|
||||||
PgfTypeHypo *parse_context(size_t *p_n_hypos);
|
PgfTypeHypo *parse_context(size_t *p_n_hypos);
|
||||||
|
|
||||||
bool eof();
|
bool is_eof() { return (token_tag == PGF_TOKEN_EOF); }
|
||||||
|
bool is_int() { return (token_tag == PGF_TOKEN_INT); }
|
||||||
|
bool is_flt() { return (token_tag == PGF_TOKEN_FLT); }
|
||||||
|
bool is_str() { return (token_tag == PGF_TOKEN_STR); }
|
||||||
|
bool is_ident() { return (token_tag == PGF_TOKEN_IDENT); }
|
||||||
|
|
||||||
|
void ident2str() { token_tag = PGF_TOKEN_STR; }
|
||||||
|
|
||||||
|
const PgfText *get_token_value() { return token_value; }
|
||||||
const char *get_token_pos() { return token_pos; }
|
const char *get_token_pos() { return token_pos; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -100,13 +100,6 @@ bool PgfLinearizer::TreeNode::linearize_item(PgfLinearizationOutputIface *out, P
|
|||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PgfSymbolLit::tag: {
|
|
||||||
auto sym_lit = ref<PgfSymbolLit>::untagged(sym);
|
|
||||||
size_t r = item->eval(ref<PgfLParam>::from_ptr(&sym_lit->r));
|
|
||||||
if (!linearize_arg(out, linearizer, sym_lit->d, r))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PgfSymbolVar::tag: {
|
case PgfSymbolVar::tag: {
|
||||||
auto sym_var = ref<PgfSymbolVar>::untagged(sym);
|
auto sym_var = ref<PgfSymbolVar>::untagged(sym);
|
||||||
linearize_var(out, linearizer, sym_var->d, sym_var->r);
|
linearize_var(out, linearizer, sym_var->d, sym_var->r);
|
||||||
|
|||||||
@@ -16,17 +16,22 @@ PgfAbstractParser::PgfAbstractParser(ref<PgfConcr> concr)
|
|||||||
|
|
||||||
PgfAbstractParser::ItemProbComparator PgfAbstractParser::item_prob_comp;
|
PgfAbstractParser::ItemProbComparator PgfAbstractParser::item_prob_comp;
|
||||||
|
|
||||||
void PgfAbstractParser::get_info(CCat *ccat, ref<PgfConcrRule> *prule, size_t **pvalues)
|
bool PgfAbstractParser::get_info(CCat *ccat, ref<PgfConcrRule> *prule, size_t **pvalues)
|
||||||
{
|
{
|
||||||
if (ccat->fid <= concr->last_fid) {
|
if (ccat->fid <= concr->last_fid) {
|
||||||
|
if (ccat->epsilon->items.size() == 0)
|
||||||
|
return false;
|
||||||
ref<PgfItem> pitem = ccat->epsilon->items[0];
|
ref<PgfItem> pitem = ccat->epsilon->items[0];
|
||||||
*prule = pitem->rule;
|
*prule = pitem->rule;
|
||||||
*pvalues = &pitem->vars[0];
|
*pvalues = &pitem->vars[0];
|
||||||
} else {
|
} else {
|
||||||
|
if (ccat->prods.size() == 0)
|
||||||
|
return false;
|
||||||
Production *prod = ccat->prods[0];
|
Production *prod = ccat->prods[0];
|
||||||
*prule = prod->rule;
|
*prule = prod->rule;
|
||||||
*pvalues = &prod->vars[0];
|
*pvalues = &prod->vars[0];
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
PgfAbstractParser::CCat *PgfAbstractParser::get_epsilon_ccat(PgfText *name, PgfMetaId fid)
|
PgfAbstractParser::CCat *PgfAbstractParser::get_epsilon_ccat(PgfText *name, PgfMetaId fid)
|
||||||
@@ -57,6 +62,7 @@ PgfAbstractParser::CCat::~CCat()
|
|||||||
delete prod;
|
delete prod;
|
||||||
}
|
}
|
||||||
for (ExprState *estate : pending) {
|
for (ExprState *estate : pending) {
|
||||||
|
if (estate != NULL)
|
||||||
delete estate;
|
delete estate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -493,7 +499,7 @@ void PgfAbstractParser::combine(State *state, Item *item, CCat *ccat)
|
|||||||
|
|
||||||
ref<PgfConcrRule> rule;
|
ref<PgfConcrRule> rule;
|
||||||
size_t *values;
|
size_t *values;
|
||||||
get_info(ccat, &rule,&values);
|
if (get_info(ccat, &rule,&values)) {
|
||||||
values = CLONE_VALUES(rule, values);
|
values = CLONE_VALUES(rule, values);
|
||||||
|
|
||||||
if (!instantiate(item->rule, &item->vars[0], item->rule->args[sym_cat->d],
|
if (!instantiate(item->rule, &item->vars[0], item->rule->args[sym_cat->d],
|
||||||
@@ -506,6 +512,7 @@ void PgfAbstractParser::combine(State *state, Item *item, CCat *ccat)
|
|||||||
delete item;
|
delete item;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
item->dot++;
|
item->dot++;
|
||||||
if (item->args[sym_cat->d] != NULL) {
|
if (item->args[sym_cat->d] != NULL) {
|
||||||
@@ -877,7 +884,7 @@ PgfParser::~PgfParser()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (ExprState *estate : it3.second->pending) {
|
for (ExprState *estate : it3.second->pending) {
|
||||||
if (estate->expr != 0)
|
if (estate != NULL && estate->expr != 0)
|
||||||
u->free_ref(estate->expr);
|
u->free_ref(estate->expr);
|
||||||
}
|
}
|
||||||
for (ExprProb &ep : it3.second->exprs) {
|
for (ExprProb &ep : it3.second->exprs) {
|
||||||
@@ -944,6 +951,64 @@ void PgfParser::bu_predict(PgfPhrasetable<PgfSymbolKS> phrasetable,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PgfParser::bu_literal(State *state, const char *name, PgfExprParser *eparser, prob_t viterbi_prob)
|
||||||
|
{
|
||||||
|
PgfText* tname = string2text(name);
|
||||||
|
ref<PgfConcrLincat> lincat =
|
||||||
|
namespace_lookup(concr->lincats, tname);
|
||||||
|
free(tname);
|
||||||
|
|
||||||
|
if (lincat == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Cont *&cont = state->conts1[lincat];
|
||||||
|
if (cont == NULL) {
|
||||||
|
cont = new Cont;
|
||||||
|
cont->ccat = NULL;
|
||||||
|
cont->lincat = lincat;
|
||||||
|
cont->state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
PgfTextSpot current = cont->state->end;
|
||||||
|
current.byte_pos += eparser->get_token_value()->size;
|
||||||
|
current.pos += eparser->get_token_value()->size;
|
||||||
|
|
||||||
|
State *next_state = new_state(current, viterbi_prob);
|
||||||
|
|
||||||
|
interval_t zero = {0,0};
|
||||||
|
CCat *&ccat = next_state->completed[cont][zero][zero];
|
||||||
|
if (ccat == NULL) {
|
||||||
|
ccat = new CCat;
|
||||||
|
ccat->fid = (++last_fid);
|
||||||
|
ccat->epsilon = 0;
|
||||||
|
ccat->cont = cont;
|
||||||
|
ccat->state = next_state;
|
||||||
|
ccat->lin_idx = zero;
|
||||||
|
ccat->value = zero;
|
||||||
|
ccat->covered = false;
|
||||||
|
ccat->viterbi_prob = 0;
|
||||||
|
|
||||||
|
#ifdef DEBUG_PARSER
|
||||||
|
{
|
||||||
|
PgfPrinter printer(NULL,0,NULL);
|
||||||
|
printer.nprintf(64,"literal [%zd-%zd; ",state->end.pos,next_state->start.pos);
|
||||||
|
printer.efun(&ccat->cont->lincat->name);
|
||||||
|
printer.puts("(0); 0; ");
|
||||||
|
printer.emeta(ccat->fid);
|
||||||
|
printer.puts("]");
|
||||||
|
PgfText *text = printer.get_text();
|
||||||
|
fprintf(stderr, "%s\n", text->text);
|
||||||
|
free(text);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ccat->pending.push_back(NULL);
|
||||||
|
ccat->exprs.emplace_back(eparser->parse_term(), 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bu_predict(next_state, viterbi_prob, ccat);
|
||||||
|
}
|
||||||
|
|
||||||
void PgfParser::bu_predict(PgfPhrasetable<PgfSymbolBIND> phrasetable,
|
void PgfParser::bu_predict(PgfPhrasetable<PgfSymbolBIND> phrasetable,
|
||||||
State *state, prob_t outside_prob)
|
State *state, prob_t outside_prob)
|
||||||
{
|
{
|
||||||
@@ -1492,6 +1557,15 @@ void PgfParser::suspend(Cont *cont,Item *item,bool do_predict,ref<PgfSymbolCat>
|
|||||||
if (cont->state->needs_bind) {
|
if (cont->state->needs_bind) {
|
||||||
bu_predict(concr->phrasetable4, cont->state, viterbi_prob);
|
bu_predict(concr->phrasetable4, cont->state, viterbi_prob);
|
||||||
} else {
|
} else {
|
||||||
|
PgfExprParser eparser(sentence, cont->state->end.byte_pos, u);
|
||||||
|
if (eparser.is_int()) {
|
||||||
|
bu_literal(cont->state, "Int", &eparser, viterbi_prob);
|
||||||
|
} else if (eparser.is_flt()) {
|
||||||
|
bu_literal(cont->state, "Float", &eparser, viterbi_prob);
|
||||||
|
} else if (eparser.is_ident()) {
|
||||||
|
eparser.ident2str();
|
||||||
|
bu_literal(cont->state, "String", &eparser, viterbi_prob);
|
||||||
|
}
|
||||||
bu_predict(concr->phrasetable1, cont->state, viterbi_prob, 1, sentence->size);
|
bu_predict(concr->phrasetable1, cont->state, viterbi_prob, 1, sentence->size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ protected:
|
|||||||
static
|
static
|
||||||
interval_t interval(ref<PgfConcrRule> rule, size_t *values, ref<PgfLParam> lparam);
|
interval_t interval(ref<PgfConcrRule> rule, size_t *values, ref<PgfLParam> lparam);
|
||||||
|
|
||||||
void get_info(CCat *ccat, ref<PgfConcrRule> *rule, size_t **pvalues);
|
bool get_info(CCat *ccat, ref<PgfConcrRule> *rule, size_t **pvalues);
|
||||||
CCat *get_epsilon_ccat(PgfText *name, PgfMetaId fid);
|
CCat *get_epsilon_ccat(PgfText *name, PgfMetaId fid);
|
||||||
|
|
||||||
static
|
static
|
||||||
@@ -292,6 +292,7 @@ class PGF_INTERNAL_DECL PgfParser : private PgfAbstractParser, public PgfExprEnu
|
|||||||
virtual void bu_predict(State *state, prob_t outside_prob, CCat *ccat);
|
virtual void bu_predict(State *state, prob_t outside_prob, CCat *ccat);
|
||||||
|
|
||||||
void bu_predict(PgfPhrasetable<PgfSymbolBIND> phrasetable, State *state, prob_t outside_prob);
|
void bu_predict(PgfPhrasetable<PgfSymbolBIND> phrasetable, State *state, prob_t outside_prob);
|
||||||
|
void bu_literal(State *state, const char *name, PgfExprParser *eparser, prob_t viterbi_prob);
|
||||||
void bu_predict(PgfPhrasetable<PgfSymbolKS> phrasetable, State *state, prob_t outside_prob, ptrdiff_t min, ptrdiff_t max);
|
void bu_predict(PgfPhrasetable<PgfSymbolKS> phrasetable, State *state, prob_t outside_prob, ptrdiff_t min, ptrdiff_t max);
|
||||||
void make_chunks(State *state, std::vector<CCat*> &chunks, prob_t prob);
|
void make_chunks(State *state, std::vector<CCat*> &chunks, prob_t prob);
|
||||||
PgfExpr process_expr(ExprState *estate, prob_t *prob);
|
PgfExpr process_expr(ExprState *estate, prob_t *prob);
|
||||||
|
|||||||
@@ -774,9 +774,9 @@ PgfText *pgf_print_ident(PgfText *name)
|
|||||||
PGF_API
|
PGF_API
|
||||||
PgfExpr pgf_read_expr(PgfText *input, PgfUnmarshaller *u)
|
PgfExpr pgf_read_expr(PgfText *input, PgfUnmarshaller *u)
|
||||||
{
|
{
|
||||||
PgfExprParser parser(input, u);
|
PgfExprParser parser(input, 0, u);
|
||||||
PgfExpr res = parser.parse_expr();
|
PgfExpr res = parser.parse_expr();
|
||||||
if (!parser.eof()) {
|
if (!parser.is_eof()) {
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
u->free_ref(res);
|
u->free_ref(res);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -787,7 +787,7 @@ PgfExpr pgf_read_expr(PgfText *input, PgfUnmarshaller *u)
|
|||||||
PGF_API
|
PGF_API
|
||||||
PgfExpr pgf_read_expr_ex(PgfText *input, const char **end_pos, PgfUnmarshaller *u)
|
PgfExpr pgf_read_expr_ex(PgfText *input, const char **end_pos, PgfUnmarshaller *u)
|
||||||
{
|
{
|
||||||
PgfExprParser parser(input, u);
|
PgfExprParser parser(input, 0, u);
|
||||||
PgfExpr expr = parser.parse_expr();
|
PgfExpr expr = parser.parse_expr();
|
||||||
*end_pos = parser.get_token_pos();
|
*end_pos = parser.get_token_pos();
|
||||||
return expr;
|
return expr;
|
||||||
@@ -838,9 +838,9 @@ PgfText *pgf_print_context(size_t n_hypos, PgfTypeHypo *hypos,
|
|||||||
PGF_API
|
PGF_API
|
||||||
PgfType pgf_read_type(PgfText *input, PgfUnmarshaller *u)
|
PgfType pgf_read_type(PgfText *input, PgfUnmarshaller *u)
|
||||||
{
|
{
|
||||||
PgfExprParser parser(input, u);
|
PgfExprParser parser(input, 0, u);
|
||||||
PgfType res = parser.parse_type();
|
PgfType res = parser.parse_type();
|
||||||
if (!parser.eof()) {
|
if (!parser.is_eof()) {
|
||||||
u->free_ref(res);
|
u->free_ref(res);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -850,9 +850,9 @@ PgfType pgf_read_type(PgfText *input, PgfUnmarshaller *u)
|
|||||||
PGF_API
|
PGF_API
|
||||||
PgfTypeHypo *pgf_read_context(PgfText *input, PgfUnmarshaller *u, size_t *n_hypos)
|
PgfTypeHypo *pgf_read_context(PgfText *input, PgfUnmarshaller *u, size_t *n_hypos)
|
||||||
{
|
{
|
||||||
PgfExprParser parser(input, u);
|
PgfExprParser parser(input, 0, u);
|
||||||
PgfTypeHypo *res = parser.parse_context(n_hypos);
|
PgfTypeHypo *res = parser.parse_context(n_hypos);
|
||||||
if (!parser.eof()) {
|
if (!parser.is_eof()) {
|
||||||
for (size_t i = 0; i < *n_hypos; i++) {
|
for (size_t i = 0; i < *n_hypos; i++) {
|
||||||
free(res[i].cid);
|
free(res[i].cid);
|
||||||
u->free_ref(res[i].type);
|
u->free_ref(res[i].type);
|
||||||
@@ -2050,33 +2050,6 @@ public:
|
|||||||
} PGF_API_END
|
} PGF_API_END
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_symlit(size_t d, size_t i0, size_t n_terms, size_t *terms, PgfExn *err)
|
|
||||||
{
|
|
||||||
if (err->type != PGF_EXN_NONE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
PGF_API_BEGIN {
|
|
||||||
if (syms == 0 || sym_index == (size_t) -1 || sym_index >= syms.size())
|
|
||||||
throw pgf_error(builder_error_msg);
|
|
||||||
|
|
||||||
if (d > n_args)
|
|
||||||
throw pgf_error(builder_error_msg);
|
|
||||||
|
|
||||||
ref<PgfSymbolLit> symlit = PgfDB::malloc<PgfSymbolLit>(n_terms*2*sizeof(size_t));
|
|
||||||
symlit->d = d;
|
|
||||||
symlit->r.i0 = i0;
|
|
||||||
symlit->r.n_terms = n_terms;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < n_terms; i++) {
|
|
||||||
symlit->r.terms[i].factor = terms[2*i];
|
|
||||||
symlit->r.terms[i].var = terms[2*i+1];
|
|
||||||
}
|
|
||||||
|
|
||||||
syms[sym_index] = symlit.tagged();
|
|
||||||
sym_index++;
|
|
||||||
} PGF_API_END
|
|
||||||
}
|
|
||||||
|
|
||||||
void add_symvar(size_t d, size_t r, PgfExn *err)
|
void add_symvar(size_t d, size_t r, PgfExn *err)
|
||||||
{
|
{
|
||||||
if (err->type != PGF_EXN_NONE)
|
if (err->type != PGF_EXN_NONE)
|
||||||
|
|||||||
@@ -638,7 +638,6 @@ struct PgfLinBuilderIface {
|
|||||||
virtual void set_lin_idx(size_t i0, size_t n_terms, size_t *terms, PgfExn *err)=0;
|
virtual void set_lin_idx(size_t i0, size_t n_terms, size_t *terms, PgfExn *err)=0;
|
||||||
virtual void add_variable(size_t range, PgfExn *err)=0;
|
virtual void add_variable(size_t range, PgfExn *err)=0;
|
||||||
virtual void add_symcat(size_t d, size_t i0, size_t n_terms, size_t *terms, PgfExn *err)=0;
|
virtual void add_symcat(size_t d, size_t i0, size_t n_terms, size_t *terms, PgfExn *err)=0;
|
||||||
virtual void add_symlit(size_t d, size_t i0, size_t n_terms, size_t *terms, PgfExn *err)=0;
|
|
||||||
virtual void add_symvar(size_t d, size_t r, PgfExn *err)=0;
|
virtual void add_symvar(size_t d, size_t r, PgfExn *err)=0;
|
||||||
virtual void add_symks(PgfText *token, PgfExn *err)=0;
|
virtual void add_symks(PgfText *token, PgfExn *err)=0;
|
||||||
virtual void start_symkp(size_t n_syms, size_t n_alts, PgfExn *err)=0;
|
virtual void start_symkp(size_t n_syms, size_t n_alts, PgfExn *err)=0;
|
||||||
@@ -667,7 +666,6 @@ typedef struct {
|
|||||||
void (*set_lin_idx)(PgfLinBuilderIface *this, size_t i0, size_t n_terms, size_t *terms, PgfExn *err);
|
void (*set_lin_idx)(PgfLinBuilderIface *this, size_t i0, size_t n_terms, size_t *terms, PgfExn *err);
|
||||||
void (*add_variable)(PgfLinBuilderIface *this, size_t range, PgfExn *err);
|
void (*add_variable)(PgfLinBuilderIface *this, size_t range, PgfExn *err);
|
||||||
void (*add_symcat)(PgfLinBuilderIface *this, size_t d, size_t i0, size_t n_terms, size_t *terms, PgfExn *err);
|
void (*add_symcat)(PgfLinBuilderIface *this, size_t d, size_t i0, size_t n_terms, size_t *terms, PgfExn *err);
|
||||||
void (*add_symlit)(PgfLinBuilderIface *this, size_t d, size_t i0, size_t n_terms, size_t *terms, PgfExn *err);
|
|
||||||
void (*add_symvar)(PgfLinBuilderIface *this, size_t d, size_t r, PgfExn *err);
|
void (*add_symvar)(PgfLinBuilderIface *this, size_t d, size_t r, PgfExn *err);
|
||||||
void (*add_symks)(PgfLinBuilderIface *this, PgfText *token, PgfExn *err);
|
void (*add_symks)(PgfLinBuilderIface *this, PgfText *token, PgfExn *err);
|
||||||
void (*start_symkp)(PgfLinBuilderIface *this, size_t n_syms, size_t n_alts, PgfExn *err);
|
void (*start_symkp)(PgfLinBuilderIface *this, size_t n_syms, size_t n_alts, PgfExn *err);
|
||||||
|
|||||||
@@ -524,13 +524,6 @@ void PgfPrinter::symbol(PgfSymbol sym)
|
|||||||
puts(">");
|
puts(">");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PgfSymbolLit::tag: {
|
|
||||||
auto sym_lit = ref<PgfSymbolLit>::untagged(sym);
|
|
||||||
nprintf(32, "{%ld,",sym_lit->d);
|
|
||||||
lparam(ref<PgfLParam>::from_ptr(&sym_lit->r));
|
|
||||||
puts("}");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PgfSymbolVar::tag: {
|
case PgfSymbolVar::tag: {
|
||||||
auto sym_var = ref<PgfSymbolVar>::untagged(sym);
|
auto sym_var = ref<PgfSymbolVar>::untagged(sym);
|
||||||
nprintf(64, "<%ld,$%ld>",sym_var->d, sym_var->r);
|
nprintf(64, "<%ld,$%ld>",sym_var->d, sym_var->r);
|
||||||
|
|||||||
@@ -537,11 +537,6 @@ PgfSymbol PgfReader::read_symbol()
|
|||||||
ref<PgfSymbolCat> sym_cat = read_symbol_idx<PgfSymbolCat>();
|
ref<PgfSymbolCat> sym_cat = read_symbol_idx<PgfSymbolCat>();
|
||||||
sym = sym_cat.tagged();
|
sym = sym_cat.tagged();
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case PgfSymbolLit::tag: {
|
|
||||||
ref<PgfSymbolLit> sym_lit = read_symbol_idx<PgfSymbolLit>();
|
|
||||||
sym = sym_lit.tagged();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case PgfSymbolVar::tag: {
|
case PgfSymbolVar::tag: {
|
||||||
ref<PgfSymbolVar> sym_var = PgfDB::malloc<PgfSymbolVar>();
|
ref<PgfSymbolVar> sym_var = PgfDB::malloc<PgfSymbolVar>();
|
||||||
|
|||||||
@@ -332,12 +332,6 @@ void PgfWriter::write_symbol(PgfSymbol sym)
|
|||||||
write_lparam(ref<PgfLParam>::from_ptr(&sym_cat->r));
|
write_lparam(ref<PgfLParam>::from_ptr(&sym_cat->r));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PgfSymbolLit::tag: {
|
|
||||||
auto sym_lit = ref<PgfSymbolLit>::untagged(sym);
|
|
||||||
write_int(sym_lit->d);
|
|
||||||
write_lparam(ref<PgfLParam>::from_ptr(&sym_lit->r));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PgfSymbolVar::tag: {
|
case PgfSymbolVar::tag: {
|
||||||
auto sym_var = ref<PgfSymbolVar>::untagged(sym);
|
auto sym_var = ref<PgfSymbolVar>::untagged(sym);
|
||||||
write_int(sym_var->d);
|
write_int(sym_var->d);
|
||||||
|
|||||||
@@ -246,7 +246,6 @@ data LParam = LParam {-# UNPACK #-} !LIndex [(LIndex,LVar)]
|
|||||||
|
|
||||||
data Symbol
|
data Symbol
|
||||||
= SymCat {-# UNPACK #-} !Int {-# UNPACK #-} !LParam
|
= SymCat {-# UNPACK #-} !Int {-# UNPACK #-} !LParam
|
||||||
| SymLit {-# UNPACK #-} !Int {-# UNPACK #-} !LParam
|
|
||||||
| SymVar {-# UNPACK #-} !Int {-# UNPACK #-} !Int
|
| SymVar {-# UNPACK #-} !Int {-# UNPACK #-} !Int
|
||||||
| SymKS Token
|
| SymKS Token
|
||||||
| SymKP [Symbol] [([Symbol],[String])]
|
| SymKP [Symbol] [([Symbol],[String])]
|
||||||
@@ -337,9 +336,6 @@ withBuildLinIface rules f = do
|
|||||||
addSymbol c_builder vtbl c_exn (SymCat d r) = do
|
addSymbol c_builder vtbl c_exn (SymCat d r) = do
|
||||||
fun <- (#peek PgfLinBuilderIfaceVtbl, add_symcat) vtbl
|
fun <- (#peek PgfLinBuilderIfaceVtbl, add_symcat) vtbl
|
||||||
callLParam (callLinBuilder4 fun c_builder (fromIntegral d)) r c_exn
|
callLParam (callLinBuilder4 fun c_builder (fromIntegral d)) r c_exn
|
||||||
addSymbol c_builder vtbl c_exn (SymLit d r) = do
|
|
||||||
fun <- (#peek PgfLinBuilderIfaceVtbl, add_symlit) vtbl
|
|
||||||
callLParam (callLinBuilder4 fun c_builder (fromIntegral d)) r c_exn
|
|
||||||
addSymbol c_builder vtbl c_exn (SymVar d r) = do
|
addSymbol c_builder vtbl c_exn (SymVar d r) = do
|
||||||
fun <- (#peek PgfLinBuilderIfaceVtbl, add_symvar) vtbl
|
fun <- (#peek PgfLinBuilderIfaceVtbl, add_symvar) vtbl
|
||||||
callLinBuilder2 fun c_builder (fromIntegral d) (fromIntegral r) c_exn
|
callLinBuilder2 fun c_builder (fromIntegral d) (fromIntegral r) c_exn
|
||||||
|
|||||||
Reference in New Issue
Block a user