2010-02-20 2 views
0

Я создаю парсер шаблонов.Ошибка 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 не обрабатывать в прямых рекурсию? Или что-то еще?

+0

У вас есть вызов рекурсивной функции? Если не ошибка сегментации, вероятно, укажет на то, что вы столкнулись с ошибкой PHP. – e4c5

+0

@ e4c5 Как уже было сказано, да, у меня есть рекурсивные вызовы функций. Почему сбой php на рекурсию? Это так сложно для переводчика? – VDVLeon

+1

Рекурсия сама по себе не слишком сложна для PHP. Однако, если по какой-либо причине ваше условие выхода не выполняется, рекурсия будет продолжаться бесконечно, высасывая всю доступную память и процессор до тех пор, пока программа или сценарий не сработает. Это справедливо для почти любого языка программирования. – e4c5

ответ

0

Я уверен, что это недосмотр в вашей очистке кода для публикации, но у вас есть дополнительный {это не закрыто.

+0

Вы правы. При форматировании кода для сообщения я сделал что-то неправильно. Но это не ошибка в реальном коде. – VDVLeon

+0

Вы пробовали die() в parseRecursive(), чтобы убедиться, что ошибка не глубже? Возможно, вы сбросите свои параметры, чтобы убедиться, что вы получаете то, что ожидаете? –

+0

, когда я положил die() в parseRecursive, получим выход матрицы. – VDVLeon

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