Я делаю рекурсивный парсинг.
В настоящее время у меня есть поддельный стек, в котором я сохраняю состояния для своего конечного автомата, поэтому, рекурсивно углубляясь в детали, я нажимаю состояние, в котором находился, и вставляю его позже, когда я закончу обработку рекурсивного бита текста.
Было бы быстрее иметь стек с идентификатором состояния, например:
int* stack = 0
int top = 0;
// ...
// drill down bit
if (stack == 0)
stack = (int*)malloc(STACK_JUMP_SIZE);
else if (top % STACK_JUMP_SIZE == 0)
stack = (int*)realloc(stack, (top+STACK_JUMP_SIZE) * sizeof(int));
stack[top++] = currentState;
// ...
// pop up later
{currentState = stack[--top]; {
if (top == 0) {
free(stack);
stack = 0;
} else if ((top+1) % STACK_JUMP_SIZE == 0) {
stack = (int*)realloc(stack, (top+1)*sizeof(int));
}
Или было бы быстрее разбить его на соответствующие функции и позволить C ++ позаботиться о стеке.
(Я знаю, что кто-то скажет мне: «Это C, а не C ++», поэтому я заранее отвечаю, C ++ моей программы, но в нем много C).