Ok, the code is actually correct. If you look at the code comment for
rewind:
/** Rewind to the input position of the last marker.
* Used currently only after a cyclic DFA and just
* before starting a sem/syn predicate to get the
* input position back to the start of the decision.
* Do not "pop" the marker off the state. mark(i)
* and rewind(i) should balance still. It is
* like invoking rewind(last marker) but it should not "pop"
* the marker off. It's like seek(last marker's input position).
*/
void rewind();
it should not release the marker. If they're still at least one
marker, remove will not clear the buffer:
public T remove() {
T o = get(0);
p++;
// have we hit end of buffer and not backtracking?
if ( p == data.size() && markDepth==0 ) {
// if so, it's an opportunity to start filling at index 0
again
clear(); // size goes to 0, but retains memory
}
return o;
}
rewind() just rewinds the last marker but doesn't release it. It
shouldn't flush. I added a comment to make it more clear in my
LookaheadStream
public void rewind() {
rewind(lastMarker); // rewind but do not release marker
}
Ter
On Mar 3, 2009, at 4:06 PM, Sam Harwell wrote:
> Taken from Java.stg, we end up with a mismatched mark/rewind, which
> causes the temporary stream buffer (FastQueue) to flush during a
> predict operation that encounters predicates.
>
> /** A state in a cyclic DFA; it's a special state and part of a big
> switch on
> * state.
> */
> cyclicDFAState
> (decisionNumber,stateNumber,edges,needErrorClause,semPredState) ::= <<
> int LA<decisionNumber>_<stateNumber> = input.LA(1);<\n>
> <if(semPredState)> <! get next lookahead symbol to test edges, then
> rewind !>
> int index<decisionNumber>_<stateNumber> = input.index();
> input.rewind();<\n>
> <endif>
> s = -1;
> <edges; separator="\nelse ">
> <if(semPredState)> <! return input cursor to state before we
> rewound !>
> input.seek(index<decisionNumber>_<stateNumber>);<\n>
> <endif>
> if ( s>=0 ) return s;
> break;
> >>
>
> For now I noticed it “works” to simply add a call input.mark() right
> after the call to input.rewind(), but I don’t think that’s the
> proper solution.
>
> Sam
> _______________________________________________
> antlr-dev mailing list
> [email protected]
> http://www.antlr.org/mailman/listinfo/antlr-dev
_______________________________________________
antlr-dev mailing list
[email protected]
http://www.antlr.org/mailman/listinfo/antlr-dev