﻿# Описание VivaVisualCode

В данной статье рассмотрена программа VivaVisualCode, демонстрирующая использование библиотеки VivaCore\. Программа VivaVisualCode графически отображает дерево разбора для вводимого исходного кода на языке Си\+\+\.

## Введение

Большим недостатком многих библиотек для работы с кодом является отсутствие примеров, позволяющих легко и наглядно оценить результаты их работы\. Такая ситуация часто наблюдается в сфере анализа и обработки исходного кода программ\. Демонстрационные примеры представляются программами, принимающими через командную строку имена файлов, огромное количество ключей и генерирующие на выходе другие файлы\. Такой недружественный интерфейс придает негативную эмоциональную окраску первому знакомству с библиотекой, в не зависимости от того, насколько библиотека подходит для решаемой задачи\.

Мы постарались применить подход, позволяющий пользователю как можно раньше понять, с чем он имеет дело\. Разрабатывая программу, демонстрирующую возможности библиотеки VivaCore мы решили сделать ее графическим приложением, строящим дерево разбора по вводимому Си\+\+ коду\. В результате появилась демонстрационная программа VivaVisualCode, которую вы можете [скачать](https://pvs-studio.ru/ru/pvs-studio/)\. Вы можете скачать как исходные тексты \(проект Visual Studio 2005\), так и исполняемый модуль\.

## Что такое VivaCore

[VivaCore](https://pvs-studio.ru/ru/pvs-studio/) \- это открытая библиотека для работы с Си и Си\+\+ кодом\. Библиотека предназначена для реализации на ее основе систем рефакторинга кода, систем статического и динамического анализа, систем трансформации или оптимизации кода, расширений языка, подсистем подсветки синтаксиса, систем построения документации по коду и других аналогичных инструментов\.

В качестве отправной точки для создания библиотеки VivaCore была взята другая открытая библиотека OpenC\+\+ [http://opencxx\.sourceforge\.net](http://opencxx.sourceforge.net/)\.

Более подробно с библиотекой VivaCore вы можете познакомиться в статье "Сущность библиотеки анализа кода VivaCore", находящейся [этому адресу](https://pvs-studio.ru/ru/blog/posts/a0013/)\. 

Лицензия на библиотеку VivaCore позволяет свободно использовать, копировать, распространять и модифицировать ее в бинарном виде или в виде исходного кода, как для коммерческого, так и для некоммерческого использования без каких\-либо отчислений авторам библиотеки\. Необходимо лишь указать авторов исходных библиотек \(OpenC\+\+ и VivaCore\)\.

Вы можете скачать библиотеку [VivaCore](https://pvs-studio.ru/ru/pvs-studio/)\.

## Что такое VivaVisualCode

VivaVisualCode \- это программа наглядно демонстрирующая возможности библиотеки VivaCode в построении деревьев разбора для кода на языке Си\+\+\. Программа VivaVisualCode реализует графическое отображение дерева разбора на экране \(смотри рисунок 1\)\.

![a0025_VivaVisualCode_ru/image2.png](https://import.viva64.com/docx/blog/a0025_VivaVisualCode_ru/image2.png)

_Рисунок 1\. Пример построенного программой VivaVisualCode дерева разбора для кода "float Value \= 10\.0 \* 20\.0;"\._

Создаваемое дерево разбора \(derivation tree \- DT, parse tree \- PT\) отличается от абстрактного синтаксического дерева \(Abstract Syntax Tree \- AST\) тем, что в нём присутствуют узлы для тех синтаксических правил, которые не влияют на семантику программы\. Классическим примером таких узлов являются группирующие скобки, в то время как в AST группировка операндов явно задаётся структурой дерева\.

## Реализация VivaVisualCode

Демонстрационная программа VivaVisualCode устроена весьма просто\. Можно сказать, что она предоставляет пользовательский интерфейс к некоторым функциям библиотеки VivaCore\. Например, она позволяет ввести с клавиатуры текст программы для разбора, графически отобразить построенное дерево разбора, вывести дополнительную информацию об узлах дерева\.

С деталями реализации вы можете познакомиться непосредственно в исходном коде программы VivaVisualCode\. Исходный код открыт, и вы можете его свободно модифицировать и использовать в своих целях\.

## Интерфейс пользователя

Кратко рассмотрим пункты меню в приложении VivaVisualCode:

* File \-\> Open i\-file\.\.\. \- позволяет загрузить препроцессированный i\-файл\. **Примечание\.** Программа служит для демонстрационных целей и не рассчитана на работу с большими файлами\.
* File \-\> Export Image \- позволяет экспортировать построенное дерево разбора в BMP файл\.
* File \-\> Exit \- выход из программы\.
* Code \-\> Edit Code \- редактирование входного Си\+\+ кода\.
* View \-\> List Mode\. В библиотеке VivaCore данные представлены в виде двоичных деревьев\. Но логически работа ведется над списками\. В результате существуют вспомогательные узлы, реализующие списки на основе дерева\. Данный пункт меню позволяет скрывать или отображать эти вспомогательные узлы\.
* View \-\> Close All \- свернуть все узлы\.
* View \-\> Open All \- развернуть все узлы\.

После ввода программы через "File\-\>Open i\-file\.\.\." или "Code\-\>Edit Code" на экране будет отображено дерево разбора\. Узлы отображаемого дерева раскрашены в различные цвета в зависимости от его типа\. В терминальных узлах \(листьях\) отображена информация о лексемах, которые они представляют\. Терминальные блоки окрашены в розовый цвет для лексем, являющихся ключевыми словами языка Си\+\+\. В других случаях они отображаются зеленым цветом, чтобы подчеркнуть, что лексемы \- это конечные листья\. Узлы верхнего уровня содержат названия и количество ветвей\.

Вы можете совершать также ряд действий над деревом:

1. Прокручивать окно, когда дерево не вмещается на экране\.
1. Сворачивать и разворачивать узлы \(левая кнопка мыши\)\.
1. Масштабировать изображение \(Ctrl \+ колесо мыши\)\.
1. О каждом из узлов можно получить дополнительную информацию, нажав на нем правой кнопкой мыши \(смотри рисунок N2\)\.

![a0025_VivaVisualCode_ru/image4.png](https://import.viva64.com/docx/blog/a0025_VivaVisualCode_ru/image4.png)

_Рисунок 2\. Просмотр закодированного типа для декларации конструктора класса\._

## Заключение

Предложенная вашему вниманию программа, конечно, не полностью демонстрирует возможности библиотеки VivaCore и не полностью раскрывает области возможного ее применения\. Но надеемся, что ее изучение поможет вам проще освоить основные принципы работы библиотеки VivaCore\.

Мы всегда открыты к общению\. Пишите нам\!