summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2011-11-15 03:25:13 +0000
committerAdrian Thurston <thurston@complang.org>2011-11-15 03:25:13 +0000
commit0e6465319995ff4226cea042012725bdd48c1c9a (patch)
treee67499457a6caf6a7eb7bf32f34655b8654c0894
parent11d7da8ff5f43daf82bb6baf894d38386fb2527d (diff)
downloadcolm-0e6465319995ff4226cea042012725bdd48c1c9a.tar.gz
Some refactoring and cleanup of the parser code compilation. Now entirely
ignoring the stream on the stack in the parsing functions. Taking the stream from the parser object.
-rw-r--r--colm/bytecode.c20
-rw-r--r--colm/compile.cc173
2 files changed, 53 insertions, 140 deletions
diff --git a/colm/bytecode.c b/colm/bytecode.c
index a8d69260..7e6b48e4 100644
--- a/colm/bytecode.c
+++ b/colm/bytecode.c
@@ -2283,7 +2283,7 @@ again:
PdaRun *pdaRun = ((Accum*)accum)->pdaRun;
FsmRun *fsmRun = ((Accum*)accum)->fsmRun;
- long pcr = parseFrag( prg, sp, (Accum*)accum, (Stream*)stream, stopId, PcrStart );
+ long pcr = parseFrag( prg, sp, (Accum*)accum, ((Accum*)accum)->stream, stopId, PcrStart );
vm_push( (SW)pdaRun );
vm_push( (SW)fsmRun );
@@ -2347,7 +2347,7 @@ again:
FsmRun *fsmRun = (FsmRun*)vm_pop();
PdaRun *pdaRun = (PdaRun*)vm_pop();
- pcr = parseFrag( prg, sp, (Accum*)accum, (Stream*)stream, stopId, pcr );
+ pcr = parseFrag( prg, sp, (Accum*)accum, ((Accum*)accum)->stream, stopId, pcr );
/* Pop the saved execution. */
Execution *pushedExec = (Execution*)vm_ptop();
@@ -2380,7 +2380,7 @@ again:
FsmRun *fsmRun = ((Accum*)accum)->fsmRun;
long consumed = ((Accum*)accum)->pdaRun->consumed;
- long pcr = parseFrag( prg, sp, (Accum*)accum, (Stream*)stream, stopId, PcrStart );
+ long pcr = parseFrag( prg, sp, (Accum*)accum, ((Accum*)accum)->stream, stopId, PcrStart );
vm_push( (SW)pdaRun );
vm_push( (SW)fsmRun );
@@ -2453,7 +2453,7 @@ again:
FsmRun *fsmRun = (FsmRun*)vm_pop();
PdaRun *pdaRun = (PdaRun*)vm_pop();
- pcr = parseFrag( prg, sp, (Accum*)accum, (Stream*)stream, stopId, pcr );
+ pcr = parseFrag( prg, sp, (Accum*)accum, ((Accum*)accum)->stream, stopId, pcr );
/* Pop the saved execution. */
Execution *pushedExec = (Execution*)vm_ptop();
@@ -2487,7 +2487,7 @@ again:
FsmRun *fsmRun = ((Accum*)accum)->fsmRun;
PdaRun *pdaRun = ((Accum*)accum)->pdaRun;
- long pcr = undoParseFrag( prg, sp, (Accum*)accum, (Stream*)input, consumed, PcrStart );
+ long pcr = undoParseFrag( prg, sp, (Accum*)accum, ((Accum*)accum)->stream, consumed, PcrStart );
vm_push( (SW)pdaRun );
vm_push( (SW)fsmRun );
@@ -2547,7 +2547,7 @@ again:
debug( REALM_BYTECODE, "IN_PARSE_FRAG_BKT3 %ld", consumed );
- pcr = undoParseFrag( prg, sp, (Accum*)accum, (Stream*)input, consumed, pcr );
+ pcr = undoParseFrag( prg, sp, (Accum*)accum, ((Accum*)accum)->stream, consumed, pcr );
/* Pop the saved execution. */
Execution *pushedExec = (Execution*)vm_ptop();
@@ -2591,7 +2591,7 @@ again:
PdaRun *pdaRun = ((Accum*)accum)->pdaRun;
FsmRun *fsmRun = ((Accum*)accum)->fsmRun;
- long pcr = parseFinish( &result, prg, sp, (Accum*)accum, stream, false, PcrStart );
+ long pcr = parseFinish( &result, prg, sp, (Accum*)accum, ((Accum*)accum)->stream, false, PcrStart );
vm_push( (SW)pdaRun );
vm_push( (SW)fsmRun );
@@ -2653,7 +2653,7 @@ again:
FsmRun *fsmRun = (FsmRun*)vm_pop();
PdaRun *pdaRun = (PdaRun*)vm_pop();
- pcr = parseFinish( &result, prg, sp, (Accum*)accum, (Stream*)stream, false, pcr );
+ pcr = parseFinish( &result, prg, sp, (Accum*)accum, ((Accum*)accum)->stream, false, pcr );
/* Pop the saved execution. */
Execution *pushedExec = (Execution*)vm_ptop();
@@ -2685,7 +2685,7 @@ again:
PdaRun *pdaRun = ((Accum*)accum)->pdaRun;
FsmRun *fsmRun = ((Accum*)accum)->fsmRun;
- long pcr = parseFinish( &result, prg, sp, (Accum*)accum, stream, true, PcrStart );
+ long pcr = parseFinish( &result, prg, sp, (Accum*)accum, ((Accum*)accum)->stream, true, PcrStart );
vm_push( (SW)pdaRun );
vm_push( (SW)fsmRun );
@@ -2759,7 +2759,7 @@ again:
FsmRun *fsmRun = (FsmRun*)vm_pop();
PdaRun *pdaRun = (PdaRun*)vm_pop();
- pcr = parseFinish( &result, prg, sp, (Accum*)accum, (Stream*)stream, true, pcr );
+ pcr = parseFinish( &result, prg, sp, (Accum*)accum, ((Accum*)accum)->stream, true, pcr );
/* Pop the saved execution. */
Execution *pushedExec = (Execution*)vm_ptop();
diff --git a/colm/compile.cc b/colm/compile.cc
index 5a5b6b2f..75081d2f 100644
--- a/colm/compile.cc
+++ b/colm/compile.cc
@@ -1336,156 +1336,59 @@ UniqueType *LangTerm::evaluateParse( ParseData *pd, CodeVect &code, bool stop )
code.append( IN_SET_INPUT_WC );
}
+ else {
+ /* Not a stream, append the item to the stream. */
-
- if ( argUT == pd->uniqueTypeStream ) {
/* Get a copy of the parser. */
code.append( IN_DUP_TOP_OFF );
code.appendHalf( 1 );
- /* Parse instruction, dependent on whether or not we are
- * producing revert or commit code. */
+ /* Not a stream. Get the input first. */
if ( pd->revertOn ) {
- code.append( IN_PARSE_FRAG_WV );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
-
- code.append( IN_PARSE_FRAG_WV2 );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
-
- code.append( IN_PARSE_FRAG_WV3 );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
+ code.append( IN_EXTRACT_INPUT_WV );
+ code.append( IN_STREAM_APPEND_WV );
}
else {
- code.append( IN_PARSE_FRAG_WC );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
-
- code.append( IN_PARSE_FRAG_WC2 );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
-
- code.append( IN_PARSE_FRAG_WC3 );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
- }
- }
- else {
- /* Get a copy of the parser. */
- code.append( IN_DUP_TOP_OFF );
- code.appendHalf( 1 );
-
- /* Not a stream. Get the input first. */
- if ( pd->revertOn )
- code.append( IN_EXTRACT_INPUT_WV );
- else
code.append( IN_EXTRACT_INPUT_WC );
-
- if ( pd->revertOn )
- code.append( IN_STREAM_APPEND_WV );
- else
code.append( IN_STREAM_APPEND_WC );
-
- /* Get a copy of the parser. */
- code.append( IN_DUP_TOP_OFF );
- code.appendHalf( 1 );
-
- if ( pd->revertOn ) {
- code.append( IN_PARSE_FRAG_WV );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
-
- code.append( IN_PARSE_FRAG_WV2 );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
-
- code.append( IN_PARSE_FRAG_WV3 );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
}
- else {
- code.append( IN_PARSE_FRAG_WC );
-
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
-
- code.append( IN_PARSE_FRAG_WC2 );
+ }
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
- code.append( IN_PARSE_FRAG_WC3 );
+ /* Get a copy of the parser. */
+ code.append( IN_DUP_TOP_OFF );
+ code.appendHalf( 1 );
- /* The stop id. */
- if ( stop )
- code.appendHalf( ut->langEl->id );
- else
- code.appendHalf( 0 );
- }
- }
+ int stopId = stop ? ut->langEl->id : 0;
- /*
- * Finish the parser.
- */
+ /* Parse instruction, dependent on whether or not we are producing revert
+ * or commit code. */
+ if ( pd->revertOn ) {
+ code.append( IN_PARSE_FRAG_WV );
+ code.appendHalf( stopId );
+ code.append( IN_PARSE_FRAG_WV2 );
+ code.appendHalf( stopId );
+ code.append( IN_PARSE_FRAG_WV3 );
+ code.appendHalf( stopId );
- if ( pd->revertOn )
+ /* Finish immediately. */
code.append( IN_PARSE_FINISH_WV );
- else
- code.append( IN_PARSE_FINISH_WC );
-
- if ( pd->revertOn )
code.append( IN_PARSE_FINISH_WV2 );
- else
- code.append( IN_PARSE_FINISH_WC2 );
-
- if ( pd->revertOn )
code.append( IN_PARSE_FINISH_WV3 );
- else
+ }
+ else {
+ code.append( IN_PARSE_FRAG_WC );
+ code.appendHalf( stopId );
+ code.append( IN_PARSE_FRAG_WC2 );
+ code.appendHalf( stopId );
+ code.append( IN_PARSE_FRAG_WC3 );
+ code.appendHalf( stopId );
+
+ /* Finish immediately. */
+ code.append( IN_PARSE_FINISH_WC );
+ code.append( IN_PARSE_FINISH_WC2 );
code.append( IN_PARSE_FINISH_WC3 );
+ }
/* Lookup the type of the replacement and store it in the replacement
@@ -2153,6 +2056,16 @@ void LangStmt::evaluateAccumItems( ParseData *pd, CodeVect &code ) const
}
if ( exprUT == pd->uniqueTypeStream ) {
+ code.append( IN_DUP_TOP );
+
+ /* Get a copy of the parser. */
+ code.append( IN_DUP_TOP_OFF );
+ code.appendHalf( 2 );
+
+ code.append( IN_SET_INPUT_WC );
+ }
+
+ if ( exprUT == pd->uniqueTypeStream ) {
code.append( IN_DUP_TOP_OFF );
code.appendHalf( 1 );