Fragment Fragment::concatenate(Fragment e1, Fragment e2) { //! +----+ +----+ //! >| e1 |-->| e2 |--> //! +----+ +----+ e1.patch(e2.start()); return Fragment(e1.start(), e2.dangling()); }
Fragment Fragment::loopone(Fragment e1) { //! +-----+ //! v | //! +----+ | //! >| e1 |-->O--> //! +----+ State* state = new State; state->what = State::Split; state->out[0] = e1.start(); e1.patch(state); return Fragment(e1.start(), { &state->out[1] }); }
Fragment Fragment::alternate(Fragment e1, Fragment e2) { //! +----+ //! +-->| e1 |--> //! | +----+ //! >O //! | +----+ //! +-->| e2 |--> //! +----+ State* state = new State; state->what = State::Split; state->out[0] = e1.start(); state->out[1] = e2.start(); return Fragment(state, e1.dangling(), e2.dangling()); }
Fragment Fragment::optional(Fragment e1) { //! +----+ //! +-->| e1 |--> //! | +----+ //! >O-----------> State* state = new State; state->what = State::Split; state->out[0] = e1.start(); return Fragment(state, e1.dangling(), { &state->out[1] }); }
Fragment Fragment::loop(Fragment e1) { //! +----+ //! +-->| e1 |--+ //! | +----+ | //! >O<----------+ //! | //! +------------> State* state = new State; state->what = State::Split; state->out[0] = e1.start(); e1.patch(state); return Fragment(state, { &state->out[1] }); }