2014-11-27 1 views
0

Есть ли способ предотвратить boost :: fusion для переполнения стека на определенный вход? У меня есть грамматика, похожая наboost :: fusion синтаксический анализ длинной строки вызывает переполнение стека

S -> S OR S 
S -> a 

и на огромном входе (> 1500 предметов OR'd) он сработает. Я не хочу разбирать такой огромный вклад, но мне нужно как-то предотвратить процесс сбоя.

Возможно, я ограничу длину строки, но это не решает мою проблему, так как a может быть длинным.

+0

Во-первых, это не слияние Грохот, что это Дух (или, более конкретно, ваши правила). Покажите свой код (SSCCE), и я попытаюсь его исправить. – sehe

+0

Похоже, что вы разбираете булевы выражения. Вы посмотрели на [Булевская грамматика выражений с Boost Spirit] (http://stackoverflow.com/questions/8706356/boolean-expression-grammar-parser-in-c/8707598#8707598) для идей? Существует [наблюдение, которое делает оценку] (http://stackoverflow.com/questions/12598029/how-to-calculate-boolean-expression-in-spirit/12602418#12602418) тоже – sehe

ответ

1

Это обычно решается путем перезаписи правой рекурсии в форму итерации, например.

myrule = something >> -(',' >> myrule); // right recursion 

в

myrule = something *(',' >> myrule); // iteration 

Конечно, это тривиальный случай. В реальных грамматиках вам часто нужно как-то удержать приоритет оператора.


В absense кода смотрите здесь примеры рефакторинга грамматик быть много легче на стеке и распределения:

 Смежные вопросы

  • Нет связанных вопросов^_^