summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2018-05-15 00:24:57 -0400
committerAdrian Thurston <thurston@colm.net>2018-05-15 00:24:57 -0400
commit63db79925f869f0fa5336764325d80e80668af76 (patch)
tree21ef32b930eb6efce6ac127b7ccdd1dc5154eda8
parentc923930f14224b5b46ddc7e95352247e698bcfe8 (diff)
downloadcolm-63db79925f869f0fa5336764325d80e80668af76.tar.gz
added an instruction for the final reduce commit
Was doing this in the parse finish instruction. Moving this out is the last change to make the frag and finish parses identical.
-rw-r--r--src/bytecode.c12
-rw-r--r--src/bytecode.h2
-rw-r--r--src/pdarun.c21
-rw-r--r--src/pdarun.h3
-rw-r--r--src/synthesis.cc4
5 files changed, 28 insertions, 14 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index ed2a464b..124d8d61 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -2748,7 +2748,6 @@ again:
break;
}
-
case IN_PARSE_FINISH_W: {
half_t stop_id;
read_half( stop_id );
@@ -2817,6 +2816,17 @@ again:
break;
}
+ case IN_REDUCE_COMMIT: {
+ stream_t *stream = vm_pop_stream();
+ vm_push_stream( stream );
+
+ debug( prg, REALM_BYTECODE, "IN_REDUCE_COMMIT\n" );
+
+ colm_parse_reduce_commit( prg, sp, stream->parser->pda_run );
+ break;
+ }
+
+
case IN_INPUT_PULL_WV: {
debug( prg, REALM_BYTECODE, "IN_INPUT_PULL_WV\n" );
diff --git a/src/bytecode.h b/src/bytecode.h
index fb866c1a..d8fb6fe0 100644
--- a/src/bytecode.h
+++ b/src/bytecode.h
@@ -287,6 +287,8 @@ typedef unsigned char uchar;
#define IN_PARSE_FINISH_BKT 0xaf
#define IN_PARSE_FINISH_EXIT_BKT 0xb0
+#define IN_REDUCE_COMMIT 0xa5
+
#define IN_PCR_CALL 0xb1
#define IN_PCR_RET 0xb2
#define IN_PCR_END_DECK 0xb3
diff --git a/src/pdarun.c b/src/pdarun.c
index 79b40528..227dd3bd 100644
--- a/src/pdarun.c
+++ b/src/pdarun.c
@@ -2214,8 +2214,6 @@ long colm_parse_frag( program_t *prg, tree_t **sp, struct pda_run *pda_run,
case PCR_START:
if ( ! pda_run->parse_error ) {
- //pda_run->stop_target = stop_id;
-
long pcr = colm_parse_loop( prg, sp, pda_run,
stream_to_impl( input ), entry );
@@ -2270,17 +2268,6 @@ long colm_parse_finish( program_t *prg, tree_t **sp,
}
}
- /* Flush out anything not committed. */
- if ( pda_run->reducer )
- commit_reduce( prg, sp, pda_run );
-
- /* What to do here.
- * if ( pda_run->fail_parsing )
- * goto fail; */
-
- //if ( !revert_on )
- // colm_rcode_downref_all( prg, sp, &pda_run->reverse_code );
-
/* COROUTINE */
case PCR_DONE:
break; }
@@ -2288,6 +2275,14 @@ long colm_parse_finish( program_t *prg, tree_t **sp,
return PCR_DONE;
}
+void colm_parse_reduce_commit( program_t *prg, tree_t **sp,
+ struct pda_run *pda_run )
+{
+ /* Flush out anything not committed. */
+ if ( pda_run->reducer )
+ commit_reduce( prg, sp, pda_run );
+}
+
long colm_parse_undo_frag( program_t *prg, tree_t **sp, struct pda_run *pda_run,
stream_t *input, long steps, long entry )
{
diff --git a/src/pdarun.h b/src/pdarun.h
index 49c95f00..fa73af2c 100644
--- a/src/pdarun.h
+++ b/src/pdarun.h
@@ -470,6 +470,9 @@ void commit_reduce( program_t *prg, tree_t **root,
tree_t *get_parsed_root( struct pda_run *pda_run, int stop );
+void colm_parse_reduce_commit( program_t *prg, tree_t **sp,
+ struct pda_run *pda_run );
+
#ifdef __cplusplus
}
#endif
diff --git a/src/synthesis.cc b/src/synthesis.cc
index 4df21af2..8a5fb218 100644
--- a/src/synthesis.cc
+++ b/src/synthesis.cc
@@ -1616,6 +1616,10 @@ UniqueType *LangTerm::evaluateParse( Compiler *pd, CodeVect &code,
parseFinish( pd, code, stopId );
}
+ if ( parserText->reduce ) {
+ code.append( IN_REDUCE_COMMIT );
+ }
+
/* Pull out the error and save it off. */
code.append( IN_DUP_VAL );
code.append( IN_GET_STREAM_MEM_R );