13 Dec 2011 22:34
global state
Jon Rafkind <rafkind <at> cs.utah.edu>
2011-12-13 21:34:00 GMT
2011-12-13 21:34:00 GMT
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();
}
RSS Feed