Дипломная работа: Автоматическое распараллеливание программ для распределенных систем. Статическое построение расширенного графа управления
- SgProgHedrStmt – заголовок программы (Fortran);
- SgProcHedrStmt – заголовок подпрограммы (Fortran);
- SgBlockDataStmt – оператор блока данных (Fortran).
Операторы объявления:
- SgVarDeclStmt – оператор объявления переменной;
- SgParameterStmt – оператор объявления констант (Fortran);
- SgImplicitStmt – оператор Implicit (Fortran).
Управляющие:
- SgForStmt – цикл FOR;
- SgIfStmt - операторветвления If-Then-Else (Fortran), if (C);
- SgLogIfStmt - оператор логического If (Fortran);
- SgArithIfStmt - оператор арифметического If (Fortran).
Исполняемые и другие:
- SgAssignStmt - оператор присваивания (Fortran);
- SgCallStmt - оператор Call (Fortran);
- SgContinueStmt - оператор Continue;
- SgControlEndStmt - обозначает конец одного из основных блоков (напр. ENDIF);
- SgReturnStmt - оператор Return;
- SgGotoStmt - оператор Goto.
Большинство операторов программы содержат некоторые выражения. Класс SgExpression является базовым для выражений всех видов:
int variant() - тэг вида выражения;
SgExpression *lhs() - левое поддерево выражения;
SgExpression *rhs() - правое поддерево выражения;
В отличие от иерархии классов, порождаемой SgStatement, не вводится подкласс для каждой операции, находящейся в корне дерева разбора выражения. Основные бинарные операции, такие, как стандартные арифметические, идентифицируются только тэгом. Листья дерева могут иметь собственные классы, например:
- SgValueExp - представляет значение одного из базовых типов;
- SgVarRefExp - ссылка на переменную или на массив;
- SgArrayRefExp - ссылка на элемент массива;
- SgFunctionCallExp - вызов функции.
Разработчиками Sage++ предлагается следующий алгоритм разбора исходной программы. Производится последовательный перебор файлов, входящих в проект. Начиная с указателя SgStatement* SgFile:: firstStatement() осуществляется обход операторов текущего файла. При этом анализируется оператор, входящие в него выражения, тело(а) – для операторов, содержащих таковое (например, управляющей группы). Переход на следующий оператор реализуется кодом cur_stmt=cur_stmt->lastNodeOfStmt()->lexNext() для операторов, не являющихся листом дерева разбора, и cur_stmt=cur_stmt->lexNext() для остальных (где cur_stmt – указатель на текущий оператор). Использование рекурсивного подхода к просмотру дерева представляется достаточно естественным.