Для этого можно использовать наш инструментарий реинжиниринга программного обеспечения DMS с интерфейсом Visual Basic .
DMS анализирует исходный текст с использованием внешнего интерфейса для абстрактного синтаксического дерева, а затем позволяет применять произвольный анализ / преобразование к этим деревьям.Многие изменения преобразования могут быть выполнены с использованием преобразования программы «источник-источник» , в котором код переписывается с использованием «если вы видите этот синтаксис, замените его на , что синтаксис ", используя грамматику как способ определения абстрактных заполнителей.Это позволяет относительно легко писать преобразования в коде, используя знакомый синтаксис.Это обобщает метод OP, который пытается сопоставить последовательности токенов.
Проблема OP может быть представлена как аспект, похожий на переписывание формы:
default domain VisualBasic~VB6;
rule function_insert_log_call(a: attributes, t: type,
i: IDENTIFIER, p: parameters, s:statements)
= function -> function
= " \a FUNCTION \i ( \p ) AS \t
\s
END FUNCTION"
-> "\a FUNCTION \i ( \p ) AS \t
my_log(\tostring\(\i\))
\s
END FUNCTION";
rule subroutine_insert_log_call(a: attributes,
i: IDENTIFIER, p: parameters, s:statements)
= subroutine -> subroutine
= " \a SUB \i ( \p )
\s
END SUB"
-> " \a SUB \i ( \p )
my_log(\tostring\(\i\))
\s
END SUB";
Эти переписывания имеют форму
rule *rulename* ( *patternvars* ) *nonterminal* -> *nonterminal*
= " *syntaxpattern* "
-> " *syntaxpattern* ";
Конкретные предоставленные правила будут распознавать заголовки и тела функций независимо от содержимого / пробелов / комментариев, поскольку они фактически совпадают с AST.«...» являются мета-кавычками, а снаружи находится синтаксис правила DMS, а внутри - синтаксис VB6.\ N внутри "..." представляет параметр (AST), который должен соответствовать нетерминальной грамматике N, объявленной в заголовке правила как ... n: N .... tostring - это пользовательская мета-функция (вызывается с помощью metaparens ()), который преобразует аргумент узла дерева в узел дерева для литеральной строки.
OP может потребоваться больше правил, чем для обработки других случаев;возможно, он хочет регистрировать вызовы GOSUB и / или записывать параметры функции в вызове log .
Другой ответ предлагает получить генератор синтаксического анализатора и, ну, в общем, определить VB6 для включения синтаксического анализа.Важно понимать, что правильно понять синтаксис VB6 очень сложно;язык плохо документирован и имеет некоторые действительно странные правила, касающиеся пробелов, операторов в строках и операторов через границы строк.Если вы не понимаете это правильно, вы просто не сможете разобрать сотни файлов.Мы должны были определить нашу собственную грамматику (как для DMS для для многих других языков ).
Подробнее об инструментарии / журналировании кода вы можете узнать, используя преобразования программы здесь