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
> [email protected]
> https://lists.csail.mit.edu/mailman/listinfo/peg
_______________________________________________
PEG mailing list
[email protected]
https://lists.csail.mit.edu/mailman/listinfo/peg