Jon Rafkind | 13 Dec 2011 22:34
Picon
Favicon

global state

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();
}

Gmane