Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бАКАЛАВР_РАБОТА.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.13 Mб
Скачать

4.2.5 Иерархия классов модуля

На рис. 4.6 представлена иерархия классов синтаксического анализатора. Где AbstractParser– интерфейсный класс;Parser_LL1–реализациякласса AbstractParser.

Использование интерфейсного класса в архитектуре приложения даёт возможности поменять реализацию синтаксического анализатора без изменения других модулей.

Рисунок 4.6 – Иерархия классов синтаксического анализатора

Листинг этого модуля представлен в ПриложенииВ в разделе синтаксический анализатор.

4.3 Семантический анализ

4.3.1 Промежуточное представление программы

Промежуточное представление программы – это структура данных, которая строится в процессе синтаксического анализа и необходима для дальнейших фаз языкового процессора таких, как семантический анализ, генерация кода.

Одним из видов промежуточных представлений является синтаксическое дерево или абстрактное синтаксическое дерево. Абстрактное синтаксическое дерево - это дерево, каждый узел которого представляет конструкцию языка, например оператор; его дочерние узлы представляют значащие компоненты конструкции, например операнды.В отличие от дерева разбора, в котором внутренниеузлы представляют нетерминалы, синтаксическое дерево не содержит “вспомогательных” конструкций таких, как множители(factor), слагаемые (term) и др.

Узлы синтаксического дерева реализованы при помощи классов. Каждый класс соответствует определённому виду конструкций языка и имеет определённое количество дочерних узлов (указателей на дочерние узлы), за исключениемлистовых узлов, таких как идентификатор или константа.При программной реализации был использован паттерн компоновщик, который компонует объекты в древовидные структуры для представления иерархий часть-целое. В рамках этого паттерны все классы делятся на “примитивы” (листовые элементы) и на “контейнеры” (внутренние узлы), при этом все классы унаследованы от общего абстрактного класса. Поэтому используя интерфейс абстрактного класса можно единообразно обращаться как к листовым элементам, так и внутренним узлам иерархии[4].

Также при проектированииклассов для узлов синтаксического дерева было учтено разделение всех конструкций языка на следующие группы:

  • операции(Expr)

  • операторы(Stmt)

Примером конструкций для операций будут арифметические и логические выражения, вызов функции, операция индексации, переменная, целая константа и др. Примером операторов или инструкций является условный оператор, конструкция уравнения, задание глобального или локального начального условия, а также целый класс конструкций объявлений(Decl) отнесён к типу оператор. Такое деление позволяет выделить основные базовые классы Expr иStmt, также среди производных классов для Expr были выделены базовые подклассы арифметических (Arith), логических(Logical) и листовых выражений(Leaf), а для Stmt – базовый подкласс объявлений(Decl).Так же были введены вспомогательные классы такие, как список операторов (Seq)и операций(ListExpr)представляющие линейные однонаправленные списки соответственно операторов и операций.

Полученная иерархия типовпредставлена на рис. 4.7, где Node- абстрактный класс, который представляет общий интерфейс для клиентов; Program– этопроизводный от Nodeкласс, представляет контейнер для списков конструкцийиз трёх основных частей программы: блока объявлений, классической части и гибридной части;Expr– производный от Nodeкласс, являетсяобщим абстрактным классом для конструкций, относящихся к типу операция, и содержит специфичные для них методы;классыVer,Func, Access–являются конкретными реализациями конструкций относящихся к типу операций, причём в рамках паттерна компоновщик они являются“контейнерами”;класс ListExpr– вспомогательный класс, реализующий список выражений, используется при разборе параметров функции; классы Arith, Logical и Leafявляются базовыми классами для групп конструкций: арифметических операций, логических операций, и листовых элементов(идентификаторы и константы), все эти классы являются “контейнерами” и реализуют специфичные для этих групп методы; классы UnaryMinus,

Рисунок 4.7 – Иерархия классов синтаксического дерева

DivExp, MulExp, MinusExp, PlusExpпредставляют реализации арифметических операций: унарный минус и бинарное деление, умножение, разность и сумма; аналогично классы And, Or, UnaryNot, Eq, Ne, Less, Gr, Ge, Leпредставляют логические операции: конъюнкция, дизъюнкция,отрицание, “==”, “!=”,”<”,”>”,”>=”, “<=”; Id, ConstantInt, ConstantFloat–реализации классов идентификатора, целой и вещественной константы; Stmt–класс аналогичный классу Expr, только для операторов; классы SetGlobal, SetGlobalIndex, SetLocal, SetLocalIndex, Equation, EquationIndex, LocalState, If – являются конкретными реализациями соответствующих операторов: задание глобальных начальных условий (ГНУ),задание ГНУ в индексной форме, задание локальных начальных условий (ЛНУ), задание ЛНУ в индексной форме, уравнение, уравнение в индексной форме,локальное состояние, условный оператор , все эти классы являются “контейнерами”;класс Declarявляется базовым классомдля операторов декларации переменных;классы DeclArray, DeclConst, DeclMacro, DeclCount соответственно являются реализациями объявлений массива, константы, макроса, счётчика, они являются “контейнерами”; класс Seq– вспомогательный класс, реализующий список операторов.