An arc-standard transition-based parser builds a dependency tree by repeatedly choosing one of three moves over a stack (partially built, top on the right) and a buffer (unread words, front on the left), starting from stack = [ROOT] and buffer = the full sentence:
SHIFT buffer.pop_front() → push(stack)
LEFT-ARC(l) s2 := head(s1); pop(stack, index -2) [needs s2 to have no pending children]
RIGHT-ARC(l) s1 := head(s2); pop(stack, index -1) [needs s1 to have no pending children]
where s1 and s2 are the top two stack items. A reduction is only legal once every word that depends on the item being popped has already been attached. Parsing a sentence of n words takes exactly 2n − 1 transitions: n SHIFTs plus n−1 reduces — the last word left on the stack once the buffer is empty is simply the sentence's root, headed implicitly by ROOT, with no extra transition needed to say so.
Fix applied in this build: the original 3D version of this simulator scripted an extra, non-standard final RIGHT-ARC that explicitly attached the sentence root to ROOT, which pushed its step count to 2n instead of 2n−1 — contradicting the very invariant its own theory text states. Verified numerically against all five example sentences here (n SHIFTs + n−1 reduces, correct head recovery in every case); this build's oracle stops as soon as the buffer is empty and a single word remains under ROOT, so it always yields exactly 2n − 1 transitions.
- Next Transition — advance the parser by exactly one SHIFT / LEFT-ARC / RIGHT-ARC move.
- Auto-Run — plays the full oracle sequence for the selected sentence at the chosen speed.
- Drag inside the main stage to pan when the sentence overflows the view; the zoom slider scales the whole layout.
- Arcs animate above the sentence as they form; the stack and buffer panels below mirror the parser's live state.