1. michael - 01 Октября, 2009 - 09:56:13 - перейти к сообщению
Хочу узнать есть ли идеи,а может и решения??? Нужно проверить корректность расставленных в php-файла фигурных скобок, т.е. написать скрипт, который это делал, например: { ... {...} {..{..}} } - верно, { ... {...} {..{..}} - нет.
2. Phantik - 01 Октября, 2009 - 10:26:50 - перейти к сообщению
Самый простой вариант:
Реализуешь класс Стек.
Далее анализируешь файл посимвольно, когда встречаешь { добавляешь ее в стек. Если встречаешь } удаляешь из стека верхний элемент.
Ошибка возможна в 2х случаях:
1) К концу файла стек не пустой.
2) При встрече очередной } стек оказывается пустой.
Без стека можно просто завести переменную равную 0.
Если встретил { увеличил на 1, встретил } - уменьшил на единицу.
Ошибки будут:
1) Если к концу файла переменая не равна 0
2) Значение переменной стало меньше 0.
Реализуешь класс Стек.
Далее анализируешь файл посимвольно, когда встречаешь { добавляешь ее в стек. Если встречаешь } удаляешь из стека верхний элемент.
Ошибка возможна в 2х случаях:
1) К концу файла стек не пустой.
2) При встрече очередной } стек оказывается пустой.
Без стека можно просто завести переменную равную 0.
Если встретил { увеличил на 1, встретил } - уменьшил на единицу.
Ошибки будут:
1) Если к концу файла переменая не равна 0
2) Значение переменной стало меньше 0.
3. michael - 01 Октября, 2009 - 10:48:40 - перейти к сообщению
Phantik пишет:
Самый простой вариант:
Реализуешь класс Стек.
Далее анализируешь файл посимвольно, когда встречаешь { добавляешь ее в стек. Если встречаешь } удаляешь из стека верхний элемент.
Ошибка возможна в 2х случаях:
1) К концу файла стек не пустой.
2) При встрече очередной } стек оказывается пустой.
Без стека можно просто завести переменную равную 0.
Если встретил { увеличил на 1, встретил } - уменьшил на единицу.
Ошибки будут:
1) Если к концу файла переменая не равна 0
2) Значение переменной стало меньше 0.
Реализуешь класс Стек.
Далее анализируешь файл посимвольно, когда встречаешь { добавляешь ее в стек. Если встречаешь } удаляешь из стека верхний элемент.
Ошибка возможна в 2х случаях:
1) К концу файла стек не пустой.
2) При встрече очередной } стек оказывается пустой.
Без стека можно просто завести переменную равную 0.
Если встретил { увеличил на 1, встретил } - уменьшил на единицу.
Ошибки будут:
1) Если к концу файла переменая не равна 0
2) Значение переменной стало меньше 0.
Спасибо, сейчас попробую
4. Champion - 01 Октября, 2009 - 10:57:59 - перейти к сообщению
Или если надо удалить элемент из стека, а стек и так пустой:
{{}}}}}}}}{{{{{
{{}}}}}}}}{{{{{
5. Phantik - 01 Октября, 2009 - 11:43:00 - перейти к сообщению
Есть правда нюанс один. При простой реализации будут учитываться фигурные скобки находящиеся в коментариях и в составе строковых констант. Поэтому код ПХП может быть верным, а алгоритм при этом может выдать ошибку.
Для более правильной работы нужно конечно модернизировать алгоритм под строки и коменты.
Для более правильной работы нужно конечно модернизировать алгоритм под строки и коменты.
6. Champion - 01 Октября, 2009 - 12:52:32 - перейти к сообщению
Если идешь посимвольно, то сделай флаг, который будет установлен в true, когда ты находишься в комментарии. Как определить начало и конец комментария, ты знаешь.
Но кроме комментариев, есть еще строки) И знаки //, /*, # в строках...
(Добавление)
и HEREDOC
Но кроме комментариев, есть еще строки) И знаки //, /*, # в строках...
(Добавление)
и HEREDOC
7. michael - 01 Октября, 2009 - 13:03:34 - перейти к сообщению
Phantik пишет:
Есть правда нюанс один. При простой реализации будут учитываться фигурные скобки находящиеся в коментариях и в составе строковых констант. Поэтому код ПХП может быть верным, а алгоритм при этом может выдать ошибку.
Для более правильной работы нужно конечно модернизировать алгоритм под строки и коменты.
Для более правильной работы нужно конечно модернизировать алгоритм под строки и коменты.
под строки там все понгятно, но как под комменты, действительно, если в коментах будет скобка, то скрипт выдаст ошибку, дело в том,что все содежимае файла пхп я преобразую в строку, тогда получается ситуация такая: <?php if(!$cgi->paramExists('msg')){ $data['msg']='Нетпараметраmsg'; printForm($data); } //dfgdfgdf} echo"{}}}}}}}}}}}}}}"; ?>
Тогда ,как мне определить, где заканчивается комментарий // или там еще и закомментирован код, так как определить, что комментарий закончен
8. Champion - 01 Октября, 2009 - 13:14:17 - перейти к сообщению
// заканчивается, если ты нашел конец строки или ?>
9. michael - 02 Октября, 2009 - 10:25:00 - перейти к сообщению
Спасибо всем , все получилось, работает отлично