1<?php
2
3/**
4 * Lexer adapted from Simple Test: http://sourceforge.net/projects/simpletest/
5 * For an intro to the Lexer see:
6 * https://web.archive.org/web/20120125041816/http://www.phppatterns.com/docs/develop/simple_test_lexer_notes
7 *
8 * @author Marcus Baker http://www.lastcraft.com
9 */
10
11namespace dokuwiki\Parsing\Lexer;
12
13/**
14 * States for a stack machine.
15 */
16class StateStack
17{
18    protected $stack;
19
20    /**
21     * Constructor. Starts in named state.
22     * @param string $start        Starting state name.
23     */
24    public function __construct($start)
25    {
26        $this->stack = [$start];
27    }
28
29    /**
30     * Accessor for current state.
31     * @return string       State.
32     */
33    public function getCurrent()
34    {
35        return $this->stack[count($this->stack) - 1];
36    }
37
38    /**
39     * Adds a state to the stack and sets it to be the current state.
40     *
41     * @param string $state        New state.
42     */
43    public function enter($state)
44    {
45        $this->stack[] = $state;
46    }
47
48    /**
49     * Leaves the current state and reverts
50     * to the previous one.
51     * @return boolean    false if we attempt to drop off the bottom of the list.
52     */
53    public function leave()
54    {
55        if (count($this->stack) == 1) {
56            return false;
57        }
58        array_pop($this->stack);
59        return true;
60    }
61}
62