Я пытаюсь создать FSM для простого компилятора.
Я решил создать массив фиксированного размера с указателями интерфейса на состояния.Эта концепция оказалась успешной с простым заполнителем FSM, который читает HTML.
Однако настоящий FSM не сработает: я получаю ошибку сегментации (в 0x0) при вызове метода обработки состояний.
Вот пример:
this->states[0] = new State0();
this->states[1] = new State1();
this->states[2] = new State2();
this->states[3] = new State3();
this->states[4] = new State4();
[...]
Когда я прохожу через него, я вижу, что соответствующий адрес меняется после каждого присваивания.
Массив определяется следующим образом:
#define STATE_COUNT 17
[...]
IState * states[STATE_COUNT];
IState:
class IState {
public:
virtual ~IState() {};
virtual int getNextState(char) = 0;
virtual bool isFinal() = 0;
virtual TokenType getTokenType() = 0;
};
State0, с кодом, свернутым для целей тестирования:
class State0 : public IState
{
public:
virtual ~State0();
int getNextState(char c)
{
return 0;
}
bool isFinal()
{
return this->final;
}
TokenType getTokenType()
{
return this->tokenType;
}
private:
TokenType tokenType;
bool final;
};
Теперь следующая строка кода вызывает SEGFAULT:
this->nextState = this->states[currentState]->getNextState(c);
currentState
равно 0, так как оно происходит при самом первом вызове.
Итак, я думаю, что это не проблема области видимости или указатель NULL.За исключением, возможно, NULL этого указателя в объектах состояния?