Здравствуйте, 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>>