err I think commit() would have to set the current state to the new one.

commit(state){
  current = state;
}

or something..

On 12/13/2011 02:34 PM, Jon Rafkind wrote:
> I am planning on supporting global state in my peg generator. The way Rats! 
> does it with transactions looks pretty good to me but my question is how to 
> actually implement the state operations in a manner that work with 
> transactions. Specifically the state has to be pure in some sense so that it 
> can be "undone" by an abort operation.
>
> My first naive idea is to have some State class (maybe defined by the user) 
> with a pointer to a child State class. The start() method of a transaction 
> would create a new State object and set parent->next to it. Then the user can 
> modify the new State object. commit() would be a no-op and abort() would 
> reset the parent->next pointer to null.
>
> In psuedo-code
>
> start(){
>   state = new State();
>   current->next = state;
>   return state;
> }
>
> abort(){
>   current->next = null;
> }
>
> commit(){}
>
> # blah = a b c
> #            |  d e f
> rule_blah(){
>    # For each production, do a start/commit/abort sequence
>    state = start();
>    rule_a(); rule_b(); rule_c();
>    commit();
>    return
>    fail: # if any of the rules failed somehow
>    abort();
>
>    state = start();
>    rule_d(); rule_e(); rule_f();
>    commit();
>    return
>    fail:
>    abort();
> }
>
> _______________________________________________
> PEG mailing list
> PEG@lists.csail.mit.edu
> https://lists.csail.mit.edu/mailman/listinfo/peg


_______________________________________________
PEG mailing list
PEG@lists.csail.mit.edu
https://lists.csail.mit.edu/mailman/listinfo/peg

Reply via email to