Я создаю парсер шаблонов.Ошибка PHP с ошибкой
Шаблон синтаксический анализатор работает следующим образом:
- разметить (сделать для каждой части кода шаблона токен)
- Анализировать
- Используйте свой класс ParserHelper. Вы можете добавлять правила для этой системы, а затем проверять список токенов на допустимую грамматику.
- Добавить/изменить некоторые маркеры для дополнительной функциональности
- Compile (перевод на PHP (для быстрой трансформации в HTML))
Хелпер анализатор является класс с этой структурой:
- защищенная функция parseRecursive (& $ offset, $ ruleName)
- защищенная функция tryOption ()$ офсета, vdParserHelperRuleOption & $ опции)
- защищенной функция tryItem (& $ смещение, vdParserHelperRuleOptionItem & $ элемент, $ граф)
Смещение стойки для маркеров смещения (так смещения = 0 означает, что первый маркер разобрать и т.д.)
Моих правил хелперов парсера имеет такую структуру:
- правила
- Опции
- Предметы
- Опции
Для людей, как знает, что контекст бесплатно грамматику является:
правило -> < option1> | < option2> | ... | < optionN>
с optionX является labda (пустой вариант) или список:
- 'Ссылка правила' (ссылка на другой правило (может быть рекурсии)) или
- а ' token '
Таким образом, функция parseRecursive вызывает tryOption, tryOption вызывает tryItem, а tryItem может вызывать parseRecursive agian.
Ошибка в функции tryItem:
...
// Try item
if($item->getType()==vdParserHelperRuleOptionItem::RuleLink){
///// The next line !!!!!!!!!!!!!
if(!$this->parseRecursive($currentOffset, $item->getData())){
///// The previous line !!!!!!!!!
return $item->isOptional();
}
}else if($item->getType()==vdParserHelperRuleOptionItem::Type){
...
}
...
Когда я удалить (заменить его, если (TRUE) {или так) линии между «» в комментариях код PHP выполняется. Но когда я не удаляю эту строку, php не выполняет мой код и ничего не выводит, и я вообще не получаю ошибки. Когда я смотрю в лог-файл апача я получаю эту ошибку:
[notice] child pid 11957 exit signal Segmentation fault (11)
Является ли это ошибка в PHP, или может PHP не обрабатывать в прямых рекурсию? Или что-то еще?
У вас есть вызов рекурсивной функции? Если не ошибка сегментации, вероятно, укажет на то, что вы столкнулись с ошибкой PHP. – e4c5
@ e4c5 Как уже было сказано, да, у меня есть рекурсивные вызовы функций. Почему сбой php на рекурсию? Это так сложно для переводчика? – VDVLeon
Рекурсия сама по себе не слишком сложна для PHP. Однако, если по какой-либо причине ваше условие выхода не выполняется, рекурсия будет продолжаться бесконечно, высасывая всю доступную память и процессор до тех пор, пока программа или сценарий не сработает. Это справедливо для почти любого языка программирования. – e4c5