Re[3]: Посоветуйте хороший парсер для JavaScript
От: vitalyk  
Дата: 06.05.08 09:01
Оценка: 8 (1)
Здравствуйте, Left2, Вы писали:

С>>А зачем для всего этого нужен парсер яваскрипта?


L>Хочу вырезать, к примеру, вызов функции Log. Отсюда хочу вырезать:

L>
L>Log("Debug info bla-bla-bla");
L>


L>а отсюда — нет:

L>
L>"Пример использования:\
L>Log("Debug info bla-bla-bla");\
L>"
L>


L>а ещё хочу отсюда вырезать:

L>
L>[1, 2, 3, 4].foreach(function(x) { y += x; Log(x); });
L>


L>Конечно если решения не найду то на последние два случая забью (потребую чтобы Log начинался с начала строки), но хочется всё делать честно...


На правах идеи (т.е. сам не использовал, немного посмотрел только что — может сработать). Можно сделать небольшой тул, который будет использовать уже имеющийся у Вас парсер (а именно jscript.dll). Создаем (или используем имеющийся) экземпляр jscript'ового движка, запрашиваем у него IActiveScriptDebug, и вызываем метод GetScriptTextAttributes последнего, куда передаем имеющийся исходник, а на выходе имеем массив "аттрибутов символов". На скорую руку сбацанный исходник выглядит так:
 // Предполагается, что spScript - это IActiveScriptPtr или IActiveScriptParsePtr
CComQIPtr<IActiveScriptDebug> spScriptDebug( spScript );
ATLASSERT( spScriptDebug );
ULONG nStrLen = static_cast<ULONG>( ::_tcslen( pstrCode ) ); // pstrCode - строка с исходником 
CAutoVectorPtr<SOURCE_TEXT_ATTR> arrSourceAttr( new SOURCE_TEXT_ATTR[nStrLen] );
if( SUCCEEDED( spScriptDebug->GetScriptTextAttributes( 
    pstrCode, 
    nStrLen,
    pstrDelimiter,   // например, "</SCRIPT>"
    0x8101 /*GETATTRTYPE_DEPSCAN | GETATTRFLAG_THIS | GETATTRFLAG_HUMANTEXT*/,
    arrSourceAttr ) )
{
    // а теперь работаем, как описано ниже
}


Далее банально ищем в исходнике строку "Log" и смотрим на аттрибуты соответствующих символов — как показали простейшие опыты, в случае, если Log является вызовом функции / объектом, его символы будут отмечены флагом 0x01, если же это комментарий / строка — то 0x80 / 0x02 (тут надо бы посмотреть внимательнее).

Опять же, будет ли оно работать на самом деле — . Есть подозрение, что, покопав глубже в эту сторону, можно получить требуемый Вам функционал.
... << RSDN@Home 1.2.0 alpha 4 rev. 1052>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.