diff --git a/5.-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B4%D0%B0-%D0%B2-SAPFOR.md b/5.-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B4%D0%B0-%D0%B2-SAPFOR.md new file mode 100644 index 0000000..58a125d --- /dev/null +++ b/5.-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D0%BF%D1%80%D0%BE%D1%85%D0%BE%D0%B4%D0%B0-%D0%B2-SAPFOR.md @@ -0,0 +1,9 @@ +В данном разделе описан алгоритм создания прохода (фазы анализа). [По данной ссылке](https://docs.google.com/document/d/1QQfpq7Xic5PDhFt5ESUUIcl_7jn1TFIGY5zznsvmbis/) можно изучить текущее описание некоторых идей и алгоритмов SAPFOR. Для добавления нового прохода, необходимо его объявить, добавить данному проходу зависимости и описать его в основном цикле запуска проходов. + +- Для объявления прохода, необходимо добавить в файл `Sapfor.h` в конец **enum passes** (и до **EMPTY_PASS**) название данного прохода, а также добавить строку его описания в `const char *passNames`. +- Зависимости проходов содержатся в файле `PassManager.h`. Зависимости задаются в функции `InitPassesDependencies()`. Если проход не имеет зависимости от других проходов, то данный пункт можно пропустить. Например, `Pass(А) <= Pass(B)` означает, что проход B зависит от прохода A, то есть проход B автоматически запустит проход А перед своим выполнением. `List <= Pass` означает, что проход зависит от всех проходов из списка. `Pass (А) <= List` означает, что каждый проход из списка зависит от прохода А. `List (A) << List (B)` означает, что каждый проход из списка B зависит от всех проходов из списка А. +- Далее необходимо создать функцию для прохода и вставить его в функции запуска проходов. Для запуска проходов используются функции **runPass** и **runAnalysis**. + - Первая функция позволяет описать сложное поведение прохода, которое отличается от **default** запуска в **switch**. Пример такого прохода - FILL_PAR_REGIONS_LINES: после выполнения данного прохода необходимо выполнить какие-то дополнительные действия. + - Вторая функция запускает анализ в два этапа. Проход не обязательно может иметь два этапа обработки, может присутствовать только первый, либо только второй. + - Первый этап – анализ дерева разбора для каждого файла программы независимо. На первом этапе каждый проход принимает как минимум `SgFile*` и выполняет обход дерева разбора каждого файла для построения некоторой информации. + - Второй этап – анализ полученной информации после первого этапа. Каждый проход может содержать в себе вторую часть анализа, например, агрегация результатов первого этапа. Данный этап не обязательно должен присутствовать для каждого прохода.