Класс разбора и подсветки PHP кода, нужна помощь...

jeka!

Просто Member
Класс разбора и подсветки PHP кода, нужна помощь...

Написал я таки скрипт который разбирает ПХП код и подсвечивает правильно, не так лажево, как делает это сам ПХП.
Объединил всё в один класс и библиотеку слов ЯП.
Этот скрипт мне уже 2 суток покоя не давал, перепробывал кучу регов и прочих специфических строковых функций...

В общем, нужна помощь в составлении 2 рег, для разбора комментариев # // и строк, я сам реги не очень понимаю, нет на руках ни одной умной книжки, но знаю, что можно составлять довольно сложные рекурсивные выражения, которыми можно практически всё.

Соурсы класса и примеры подсветки тут: http://spylab.ru

Так же буду благодарен за любые советы по улучшению работы класса.

Сразу скажу, скрипт писал чисто ради спортивного интереса, можно ли сделать всё на PHP, без использования всяких Tokenizer functions и highlight_string().

И ещё потому, что в сети ничего интересного на эту тему не нашел, а значит стоит написать, или хотя бы попробывать...
 

jeka!

Просто Member
Всё не так, во первых всего используется 3 цвета кажись, читать не удобно, а у меня всё можно разобрать по состовляющим.
И ещё важный момент, что слегка модифицировав мой класс, можно подсвечивать не только PHP, но и перл, java, ASP и прочее...
Да, походу раньше PHP глотал мета символы, сейчас протестировал, вроде не нашел битой реги...
А ещё год назад куда то пропадали \ экранирующие слеши...
При любом раскладе у ПХП расцветка некрасивая...
 

tony2001

TeaM PHPClub
jeka!
>Всё не так
исправь или хотя бы дай код для тестирования.
send a patch or shut up (с)
 

Blindman

Новичок
jeka! попробуй такой код
PHP:
<?php
  $x="aaaaaaaaaa \" \''' \"\\";
  $y="SELECT * FROM `table`";
  $z="echo print mysql_connect";
?>
кстати, homesite с подобным кодом тоже не справляется (по крайней мере в версии 4.5, последней версии под рукой нет)
подобных примеров можно придумать сколько угодно

я лично вообще сомневаюсь, что с помощью РВ можно сделать качественный разбор текста с более-менее сложной грамматикой. Например, Colorer - довольно мощная тулза, но и он иногда "спотыкается"
 

fixxxer

К.О.
Партнер клуба
Колорер на кавычках спотыкается дико.
Из-за этого я и перешел с FAR-а на vim :)
 

Krisha

pain in the neck
fixxxer
Угу, я пытался пытался его подкорректить так ниче и не получилось. Было бы хорошо если бы его кто нить пофиксил за пиво :)
 

jeka!

Просто Member
Blindman
Вставил этот код в свой HomeSite5.0, ошибок нет.
Я с этим 5.0 редактором уже года 2 сижу, раньше юзал блокнот, потом сразу перешел на HomeSite4.5 как он появился, глюков по стрингам там не замечал никогда.
Единственное на чем он запорется, это такой код:
$var = HTML<<<
...
Вот тут то и будут всё, что ниже, то глюки...
Именно из-за этого я этими выражениями никогда не пользуюсь.

В общем, я скачал с сайта Macromedia исходники парсера HomeSite (они там свободно выложены). Я смотрел, там используются для поиска строк обычные реги, даже можно сказать слишком простые, так и не понял как это работает, вот кусок кода:
PHP:
On PHP_START SeekTo	(PHP_DEFAULT [IN_PHP_DEFAULT])
%%words
// PHP Comments
'#'			DONT_CARE	PHP_COMMENT_LINE_START	[IN_PHP_DEFAULT]
'\/\/'		DONT_CARE	PHP_COMMENT_LINE_START	[IN_PHP_DEFAULT]
'\n'		DONT_CARE	PHP_COMMENT_LINE_STOP	[IN_PHP_COMMENT_LINE]
'\/*'		DONT_CARE	PHP_COMMENT_STAR_START	[IN_PHP_DEFAULT]
'*\/'		DONT_CARE	PHP_COMMENT_STAR_STOP	[IN_PHP_COMMENT_STAR]
// PHP Execution String
'`'			DONT_CARE	PHP_EXECSTRING_START	[IN_PHP_DEFAULT]
'`'			DONT_CARE	PHP_EXECSTRING_STOP		[IN_PHP_EXECSTRING]
// PHP String
'"'			DONT_CARE	PHP_STRING_START		[IN_PHP_DEFAULT]
'"'			DONT_CARE	PHP_STRING_STOP			[IN_PHP_STRING]
'\''		DONT_CARE	PHP_STRING_SQ_START		[IN_PHP_DEFAULT]
'\''		DONT_CARE	PHP_STRING_SQ_STOP		[IN_PHP_STRING_SQ]
%%handlers
PHP_VARIABLE	'[A-Za-z0-9_$]'?'[^A-Za-z0-9_]'_discard_
 ..........
InState IN_PHP_STRING (
	PHP_STRING	'[^"\\]' DONT_CARE ?	DONT_CARE _discard_
	PHP_STRING	'\\'	DONT_CARE	DONT_CARE _discard_
)

InState IN_PHP_STRING_SQ (
	PHP_STRING	'[^\'\\]'	DONT_CARE?	DONT_CARE	_discard_
	PHP_STRING	'\\'		DONT_CARE	DONT_CARE	_discard_
)
Константы там имеют значения тоже регэкспов.
В общем, я С практически не понимаю, но видно что всё разбирается обычными регами, вот собственно и встаёт такой вопрос: А ПХП что не может справиться с этим? Чем эти реги круче тех?
Тут наверное специалист нужен.
Кстати, где можно посмотреть подсветку vim?
Не помню такой редактор, может vi?
 

Blindman

Новичок
HomeSite использует компонент TSyntaxMemoParser написанный AFAIK на Object Pascal. Приведенный тобой код - это не С, а скрипт на внутреннем языке TSyntaxMemoParser. По-видимому, этот скрипт используется для построения parsing tables. Исходный код этого компонента мне недоступен, поэтому с уверенностью сказать не могу. Но в любом случае синтаксический анализ текста - задача нетривиальная, и PHP для нее явно не подходит. Пример синтаксического анализа на PHP - PHP_Parser из PEAR, но он все равно использует tokenizer functions.

VIM = Vi IMproved
http://www.vim.org/
 

fixxxer

К.О.
Партнер клуба
Krisha
В последней бете с этим (с кавычками) намного лучше. Но она регулярно вылетает :)
 

Demiurg

Guest
про вопрос уже забыли ? все редакторами мерятся ?

jeka!
имхо, для корректной подсветки нужно разобрать код на составляющие. Надо читать, как это делают компиляторы.
 

jeka!

Просто Member
имхо, для корректной подсветки нужно разобрать код на составляющие. Надо читать, как это делают компиляторы.
Я тут думал, вероятно так и надо делать, вобще я думаю что разобрать код реально, даже средствами PHP, ведь надо просто учесть все правила, по которым составляется код.
Например: строка начинается с = или ( или .\n , и в ней должно быть равное кол-во обратных слешей или кавычек и т.п.
Можно код разбивать сначала на участки, а потом эти участки обрабатывать регами или ещё как-то.
Тока вот неизвестно сколько потребуется ресурсов для такого разбора. Если после этого скрипт размером 1 кб. будет подсвечиваться 10 сек, то и нет смысла ничего этого делать.
 

mutex

Guest
jeka!
Зашел на твою страничку. Понравилась идея проекта HTTP Search. Я тоже пишу такой движок, но он является частью другого проекта. Предлагаю объединить усилия.
 

jeka!

Просто Member
Автор оригинала: mutex
jeka!
Зашел на твою страничку. Понравилась идея проекта HTTP Search. Я тоже пишу такой движок, но он является частью другого проекта. Предлагаю объединить усилия.
HTTP Search я просто так написал, чтобы сайт пустой небыл...
Я не вижу там ничего сложного, чтобы объединять усилия.

Если есть какие либо вопросы по коннектам к серверам или организацией загрузки контента (веб боты, пауки), пиши на мыло...
 

mutex

Guest
jeka!
Дело не в коннекте, а в рекурсии. Я пишу скрипт для экономии трафика (закачиваешь сначала на сервер - потом жмешь tar'ом). Одной из функций программы является возможность выкачивать сайты целиком (или до определенного уровня вложенности ссылок). После чего содержимое пакуется в tar.gz и отправляется пользователю. Не знаю как реализовать рукурсивный алгоритм. Причем нужно учитывать не только ссылки, но и фреймы. Твоего мыла, кстати не нашел. У меня есть пара вопросов и предложений по subj (подсветка синтаксиса).
 

jeka!

Просто Member
mutex
мыло [email protected] - оно в классе было написано.
А вобще, не совсем понимаю зачем ты этим занимаешься, есть такая прога, wget называется, есть практически на каждом хостинге. Вот ей то и надо выкачивать сайты. а потом так же сжимать в тар.
В общем, wget качает в десятки раз быстрее, чем любая реализация на PHP.
А рекурсию очень легко делать, возьми например мой класс, там в примерах показано как приконектиться, вытащить новые ссылки со страницы, и что мешает записать их в массив и опять пройтись, пока ссылки не закончатся?

Примерно так:

PHP:
$array["http://test.ru"]=1; // Начальная ссылка
$cashe=array();
while($cur_url=array_shift(array_flip($array))) {
    if (isset($cashe[$cur_url])) continue;
    // тут коннект к урлу $cur_url
    // тут вытаскиваешь новые ссылки
    foreach ($newlink as $v) $array[$v]=1;
    $cashe[$cur_url]=1; // Запоминаем урл, чтобы не зайти на него снова.
    if (!count($array)) break; // если закончились, выход.
}
Короче писал так, от балды, ну думаю принцип ясен.
 
Сверху