summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2016-05-25 09:36:05 +0000
committerkrasimir <krasimir@chalmers.se>2016-05-25 09:36:05 +0000
commitfaebebc8f4b4587c9c1849e20473ef9ef6678ded (patch)
tree4f3cc25fac14432315630ba5ca8235591c717769
parent41a3054e9be03f7496fdbe7d0716e7986524bb35 (diff)
pgf_generate_all now works with literals as well
-rw-r--r--src/runtime/c/pgf/jit.c51
-rw-r--r--src/runtime/c/pgf/reasoner.c81
-rw-r--r--src/runtime/c/pgf/reasoner.h10
3 files changed, 133 insertions, 9 deletions
diff --git a/src/runtime/c/pgf/jit.c b/src/runtime/c/pgf/jit.c
index 011d10899..4fd80dac0 100644
--- a/src/runtime/c/pgf/jit.c
+++ b/src/runtime/c/pgf/jit.c
@@ -154,6 +154,57 @@ pgf_jit_predicate(PgfReader* rdr, PgfAbstr* abstr,
abscat->predicate = (PgfFunction) jit_get_ip().ptr;
+ if (strcmp(abscat->name, "String") == 0) {
+ gu_printf(out, err, " MK_STRING\n");
+
+ jit_prepare(2);
+ jit_pusharg_p(JIT_VCLOS);
+ jit_pusharg_p(JIT_VSTATE);
+ jit_finish(pgf_reasoner_mk_string);
+
+#ifdef PGF_JIT_DEBUG
+ gu_puts(" RET\n", out, err);
+#endif
+ // compile RET
+ jit_bare_ret();
+
+ return;
+ }
+
+ if (strcmp(abscat->name, "Int") == 0) {
+ gu_printf(out, err, " MK_INT\n");
+
+ jit_prepare(2);
+ jit_pusharg_p(JIT_VCLOS);
+ jit_pusharg_p(JIT_VSTATE);
+ jit_finish(pgf_reasoner_mk_int);
+
+#ifdef PGF_JIT_DEBUG
+ gu_puts(" RET\n", out, err);
+#endif
+ // compile RET
+ jit_bare_ret();
+
+ return;
+ }
+
+ if (strcmp(abscat->name, "Float") == 0) {
+ gu_printf(out, err, " MK_FLOAT\n");
+
+ jit_prepare(2);
+ jit_pusharg_p(JIT_VCLOS);
+ jit_pusharg_p(JIT_VSTATE);
+ jit_finish(pgf_reasoner_mk_float);
+
+#ifdef PGF_JIT_DEBUG
+ gu_puts(" RET\n", out, err);
+#endif
+ // compile RET
+ jit_bare_ret();
+
+ return;
+ }
+
PgfAbsFun* absfun = NULL;
PgfAbsFun* next_absfun = NULL;
diff --git a/src/runtime/c/pgf/reasoner.c b/src/runtime/c/pgf/reasoner.c
index dbf0075d6..1fb31e9a0 100644
--- a/src/runtime/c/pgf/reasoner.c
+++ b/src/runtime/c/pgf/reasoner.c
@@ -324,12 +324,80 @@ pgf_reasoner_try_constant(PgfReasoner* rs, PgfExprState* prev, PgfAbsFun* absfun
pgf_reasoner_complete(rs, prev);
}
+static void
+pgf_reasoner_mk_literal(PgfReasoner* rs, PgfExprState* parent,
+ GuString cat, PgfExpr expr)
+{
+ PgfAnswers* answers = gu_map_get(rs->table, cat, PgfAnswers*);
+ if (answers == NULL) {
+ answers = gu_new(PgfAnswers, rs->pool);
+ answers->parents = gu_new_buf(PgfExprState*, rs->pool);
+ answers->exprs = gu_new_buf(PgfExprProb*, rs->pool);
+ answers->outside_prob = parent->base.prob;
+
+ gu_map_put(rs->table, cat, PgfAnswers*, answers);
+ }
+
+ gu_buf_push(answers->parents, PgfExprState*, parent);
+
+ if (gu_buf_length(answers->parents) == 1) {
+ PgfExprProb* ep = gu_new(PgfExprProb, rs->out_pool);
+ ep->prob = 0;
+ ep->expr = expr;
+ gu_buf_push(answers->exprs, PgfExprProb*, ep);
+ }
+
+ if (&parent->base.header == rs->start)
+ return;
+
+ PgfExprProb* ep =
+ gu_buf_get(answers->exprs, PgfExprProb*, 0);
+
+ parent->expr =
+ gu_new_variant_i(rs->out_pool,
+ PGF_EXPR_APP,
+ PgfExprApp,
+ parent->expr,
+ ep->expr);
+#ifdef PGF_REASONER_DEBUG
+ parent->arg_idx++;
+#endif
+ parent->base.prob += ep->prob;
+ gu_buf_heap_push(rs->pqueue, &pgf_expr_state_order, &parent);
+}
+
+void
+pgf_reasoner_mk_string(PgfReasoner* rs, PgfExprState* parent)
+{
+ pgf_reasoner_mk_literal(rs, parent, "String",
+ pgf_expr_string("FOO", rs->out_pool));
+}
+
+void
+pgf_reasoner_mk_int(PgfReasoner* rs, PgfExprState* parent)
+{
+ pgf_reasoner_mk_literal(rs, parent, "Int",
+ pgf_expr_int(999, rs->out_pool));
+}
+
+void
+pgf_reasoner_mk_float(PgfReasoner* rs, PgfExprState* parent)
+{
+ pgf_reasoner_mk_literal(rs, parent, "Float",
+ pgf_expr_float(999.99, rs->out_pool));
+}
+
static PgfExprProb*
pgf_reasoner_next(PgfReasoner* rs)
-{
- size_t n_exprs = gu_buf_length(rs->exprs);
+{
+ for (;;) {
+ if (rs->n_reported_exprs < gu_buf_length(rs->exprs)) {
+ return gu_buf_get(rs->exprs, PgfExprProb*, rs->n_reported_exprs++);
+ }
+
+ if (gu_buf_length(rs->pqueue) == 0)
+ return NULL;
- while (gu_buf_length(rs->pqueue) > 0) {
PgfReasonerState* st;
gu_buf_heap_pop(rs->pqueue, &pgf_expr_state_order, &st);
@@ -344,13 +412,7 @@ pgf_reasoner_next(PgfReasoner* rs)
#endif
rs->eval_gates->enter(rs, &st->header);
-
- if (n_exprs < gu_buf_length(rs->exprs)) {
- return gu_buf_get(rs->exprs, PgfExprProb*, n_exprs);
- }
}
-
- return NULL;
}
static void
@@ -379,6 +441,7 @@ pgf_new_reasoner(PgfPGF* pgf, GuExn* err, GuPool* pool, GuPool* out_pool)
rs->pqueue = gu_new_buf(PgfReasonerState*, rs->pool);
rs->exprs = gu_new_buf(PgfExprProb*, rs->pool);
+ rs->n_reported_exprs = 0;
rs->en.next = pgf_reasoner_enum_next;
PgfFunction* cafs = gu_seq_data(rs->eval_gates->cafs);
diff --git a/src/runtime/c/pgf/reasoner.h b/src/runtime/c/pgf/reasoner.h
index 21dcd6997..a08a94cda 100644
--- a/src/runtime/c/pgf/reasoner.h
+++ b/src/runtime/c/pgf/reasoner.h
@@ -29,6 +29,7 @@ struct PgfReasoner {
PgfAbswersMap* table;
GuBuf* pqueue;
GuBuf* exprs;
+ size_t n_reported_exprs;
PgfClosure* start;
PgfEvalGates* eval_gates; // cached from pgf->abstr->eval_gates
GuExn* err;
@@ -135,6 +136,15 @@ pgf_reasoner_complete(PgfReasoner* rs, PgfExprState* st);
void
pgf_reasoner_try_constant(PgfReasoner* rs, PgfExprState* prev, PgfAbsFun* absfun);
+void
+pgf_reasoner_mk_string(PgfReasoner* rs, PgfExprState* parent);
+
+void
+pgf_reasoner_mk_int(PgfReasoner* rs, PgfExprState* parent);
+
+void
+pgf_reasoner_mk_float(PgfReasoner* rs, PgfExprState* parent);
+
PgfClosure*
pgf_evaluate_expr_thunk(PgfReasoner* rs, PgfExprThunk* thunk);