diff options
author | Adrian Thurston <thurston@complang.org> | 2011-11-15 03:25:13 +0000 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2011-11-15 03:25:13 +0000 |
commit | 0e6465319995ff4226cea042012725bdd48c1c9a (patch) | |
tree | e67499457a6caf6a7eb7bf32f34655b8654c0894 | |
parent | 11d7da8ff5f43daf82bb6baf894d38386fb2527d (diff) | |
download | colm-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.c | 20 | ||||
-rw-r--r-- | colm/compile.cc | 173 |
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 ); |