BC/NW 2016 № 2 (29):11.3
РАЗРАБОТКА ЛЕКСИЧЕСКОГО АНАЛИЗАТОРА КОДА SYSTEMC
Цепаев В. С.
Цель работы – разработать программу, производящую посимвольное считывание символов из модели, выполненной на языке SystemC, распознающую среди них отдельные слова (операции, операнды и служебные) и определяющую, к какой категории они относятся.
Исходными данными являются пары файлов: заголовочный и текста модели, представляющие в совокупности модель цифрового устройства, выполненную на языке SystemC.
Основой алгоритма лексического анализа является прочтение исходного текста построчно, определение в строке слов языка SystemC и определение категории в которую эти слова входят.
Для реализации алгоритма в прикладной программе был использован язык программирования С#.
Описание структуры модели языка SYSTEMC
Описание файловой структуры языка SystemC
Проект на языке SystemC состоит из набора файлов .cpp и .h. Для того чтобы полноценно работать, не требуется какая-либо среда разработки,поддерживающая данный язык. Достаточным условием является наличиекомпилятора C++ и библиотеки SystemC. На рисунке 1.1 изображена схемапроцесса компиляции проекта на SystemC.
Рисунок 1.1 – Процесс компиляции проекта SystemC
Компилятор C++ обрабатывает файлы .h и .cpp из набора файлов проекта SystemC и создает объектные файлы (расширение файла .o). После создания объектных файлов компоновщик связывает созданные объектные файлы и соответствующие объектные файлы библиотеки SystemC (и других библиотек, таких как стандартная библиотека шаблонов или STL). В результате создается исполняемый файл, который содержит в себе ядро моделирования SystemC с функциональными возможностями исходного проекта.
В данной разработке рассматриваться только содержимое файлов .h и .cpp .
Описание модельной структуры.
Модель цифрового устройства на языке SystemC состоит из нескольких блоков, у каждого из которых, в свою очередь, есть своя структура. Для описания каждой составной части модели используется макрос С++ SC_MODULE.
Описание каждого модуля на SystemC содержится в заголовочном файле <имя модуля>.h и содержит:
· Объявление портов;
· Объявление внутренних сигналов;
· Объявление внутренних переменных;
· Объявление экземпляров подмодулей;
· Конструктор;
· Деструктор;
· Процессы;
· Функции процессов;
· Вспомогательные функции.
Поскольку в данном курсовом проекте рассматривается только лексическая
часть анализатора кода, то весь будет разбит на следующие лексические
категории:
o Служебные слова языка SystemC и языка С++;
o Типы данных;
o Структурных единиц кода (переменные, константы и функции);
o Комментарии
Разработка программы
Пользовательский интерфейс
Программы написана с помощью языка C# и представляет собой исполняемый файл Windows Forms, в котором реализованы диалог открытия файлов .cpp или .h , лексический анализ открытого файла с выводом результата на экран, а так же возможность сохранить результат анализа в файле .txt посредством диалога сохранения файла. Каждая из перечисленных функций реализуется путем нажатия на соответствующую кнопку.
Рис. 2. Внешний вид программы.
Таблица 1
Элементы управления программы.
Обработка нажатий на кнопки button1, button3 и button4 не будет рассматриваться в данной разработке по причине их тривиальности.
По нажатию кнопки «Анализировать» проверяется существование файла, указаного в верхней текстовой форме. Путь к файлу загружается из диалога выбора файла, но пользователь может изменить этот путь вручную.
В случае, если файл не существует, выдается сообщение об этом. В случае если файл существует, начинается процедура анализа.
Анализ файла
Рис. 2.2 Схема алгоритма анализа файла
В верхнем уровне алгоритма анализа файла происходит чтение файла по строкам и вызов процедуры анализа строки для каждой из считанных строк.
По достижению конца файла в результат анализа добавляется запись о завершении анализа файла с полным путем к файлу, и активизируется кнопка сохранения результата.
2.3Анализ строки
Рис. 2.3. Схема алгоритма анализа строки
Анализируемая строка считывается посимвольно и накапливает символы в слове до тех пор, пока не произойдет одна из ситуаций:
1) Встретится символ окончания слова. В эти символы входят пунктуационные символы, которые не могут входить в слово языка SystemC. По нахождению такого символа накопленное слово отправляется на анализ.
2) Cтрока завершится. Последний символ строки добавляется к слову, если он не является символом окончания слова, и слово отправляется на анализ.
Отдельно обрабатываются комбинации символов окончания слова:
1)Комбинация «//» означает открытие комментария. По нахождению такой комбинации поднимает флаг «комментарий», с которым любой дальнейший символ считается частью слова.
2)Комбинации «>>» и «<<» означают операцию перегрузки. По их появлению в результат анализа добавляется соответствующая запись.
Анализ слова
Рис 2.4 Схема алгоритма анализа слова
Анализируемое слово проходит проверку на соответствие одной из категорий по следущим признакам:
Таблица 2.
Категории слов
Тестирование программы
В качестве проверки работоспособности был использован заголовочный файл модели адресного регистра ADRRG.h
Содержимое файла ADRRG.h :
#ifndef __ADRRG_h__
#define __ADRRG_h__
#include <systemc.h>
SC_MODULE( ADRRG )
{
sc_in< sc_bv< 14 > > A;
sc_in <bool> C1;
sc_out< sc_bv< 10 > > MA;
sc_out< sc_bv< 4 > > CA;
sc_event delay;
SC_CTOR( ADRRG ):
A("A"),
C1("C1"),
MA("MA"),
CA("CA")
{
SC_METHOD(do_delay);
sensitive << C1;
SC_METHOD(do_ADRRG);
sensitive << delay;
}
void do_delay(){delay.notify(25, SC_NS);}
void do_ADRRG()
{
MA.write(A.read().range(9,0));
CA.write(A.read().range(13,10));
}
~ADRRG()
{
}
};
SC_MODULE_EXPORT( ADRRG )
#endif //__ADRRG_h__
Содержимое файла результата анализа ADDRG_result.txt :
Начало анализа файла C:\Users\lenovo\Desktop\МЭИ\Masters Thesis\master_exec\ADRRG.h
Анализ новой строки: 1
#ifndef служебное слово
__ADRRG_h__ операнд или метод
Анализ новой строки: 2
#define служебное слово
__ADRRG_h__ операнд или метод
Анализ новой строки: 3
Анализ новой строки: 4
#include служебное слово
systemc операнд или метод
Анализ новой строки: 3
Анализ новой строки: 4
#include служебное слово
systemc операнд или метод
h операнд или метод
Анализ новой строки: 5
Анализ новой строки: 6
SC_MODULE служебное слово
ADRRG операнд или метод
Анализ новой строки: 7
Анализ новой строки: 8
Анализ новой строки: 9
sc_in служебное слово
sc_bv тип данных
14 операнд или метод
A операнд или метод
Анализ новой строки: 10
sc_in служебное слово
bool тип данных
C1 операнд или метод
Анализ новой строки: 11
sc_out служебное слово
sc_bv тип данных
10 операнд или метод
MA операнд или метод
Анализ новой строки: 12
sc_out служебное слово
sc_bv тип данных
4 операнд или метод
CA операнд или метод
Анализ новой строки: 13
sc_event служебное слово
delay операнд или метод
Анализ новой строки: 14
Анализ новой строки: 15
SC_CTOR служебное слово
ADRRG операнд или метод
Анализ новой строки: 16
A операнд или метод
"A" операнд или метод
Анализ новой строки: 17
C1 операнд или метод
"C1" операнд или метод
Анализ новой строки: 18
MA операнд или метод
"MA"
Анализ новой строки: 19
CA операнд или метод
"CA" операнд или метод
Анализ новой строки: 20
Анализ новой строки: 21
SC_METHOD служебное слово
do_delay операнд или метод
Анализ новой строки: 22
sensitive служебное слово
C1 операнд или метод
Анализ новой строки: 23
SC_METHOD служебное слово
do_ADRRG операнд или метод
Анализ новой строки: 24
sensitive служебное слово
delay операнд или метод
Анализ новой строки: 25
Анализ новой строки: 26
void служебное слово
//__ADRRG_h__ комментарий
Анализ новой строки: 42
Достигнут конец файла C:\Users\lenovo\Desktop\МЭИ\Masters Thesis\master_exec\ADRRG.h
Заключение
В результате выполнения разработки был получен алгоритм лексического анализа кода на языке SystemC. Данный алгоритм был реализован в виде прикладной программы для компьютеров под управлением операционной системы Microsoft Windows. Работоспособность алгоритма была протестирована с использованием уже существующих моделей цифровых устройств.
Данный алгоритм является базой для дальнейшей разработки анализатора кода SystemC , который будет являться частью транслятора с языка SystemC на язык VHDL.