Я создаю синтаксический анализатор шаблонов.
Анализатор шаблонов работает так:
- Tokenize (сделать для каждой части кода шаблона токен)
- Анализировать
- Используйте мой класс ParserHelper. Вы можете добавить правила для этой системы, а затем она проверит список токенов на правильность грамматики.
- Добавить / изменить некоторые токены для дополнительной функциональности
- Компиляция (перевод в php (для быстрого преобразования в html))
Помощник синтаксического анализатора - это класс с такой структурой:
- защищенная функция parseRecursive (& $ offset, $ ruleName)
- защищенная функция tryOption (& $ offset, vdParserHelperRuleOption & $ option)
- защищенная функция tryItem (& $ offset, vdParserHelperRuleOptionItem & $ item, $ count)
Смещение означает смещение токена (таким образом, смещение = 0 означает первый токен для анализа и т. Д.)
Мои правила помощника синтаксического анализатора имеют такую структуру:
Для людей, как узнать, что такое не зависящий от контекста грамматик:
rule -> | | ... | * 1047 *
с параметром X - это labda (пустая опция) или список:
- 'ссылка на правило' (ссылка на другое правило (может быть рекурсия)) или
- токен
Таким образом, функция 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){
...
}
...
Когда я удаляю (заменяю на if (true) {или около того) строку между комментариями 'the', выполняется код php. Но когда я не удаляю эту строку, php не выполняет мой код и ничего не выводит, и я не получаю никакой ошибки вообще. Когда я смотрю в файл журнала apache, я получаю эту ошибку:
[notice] child pid 11957 exit signal Segmentation fault (11)
Это ошибка в php, или php не может обрабатывать прямую рекурсию? Или это что-то еще?