loom

Форк
0
/
generateDotFile.cpp 
110 строк · 3.5 Кб
1
/*
2
MIT License
3

4
Copyright (c) 2021 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
5

6
https://bmstu.codes/lsx/simodo
7
*/
8

9
#include "simodo/engine/utility/generateDotFile.h"
10
#include "simodo/engine/utility/common_functions.h"
11

12
// #include "simodo/sbl/OperationCode.h"
13

14
#include "simodo/inout/convert/functions.h"
15

16
#include <iostream>
17
#include <fstream>
18

19
namespace
20
{
21
    void generateDotBoxes(const simodo::ast::Node & node, std::ostream & dot, const std::map<simodo::ast::OperationCode,std::string> &excluded_nodes)
22
    {
23
        for(const simodo::ast::Node & n : node.branches())
24
        {
25
            std::string substitute_text;
26

27
            if (auto it=excluded_nodes.find(n.operation()); it != excluded_nodes.end()) {
28
                substitute_text = it->second;
29

30
                if (substitute_text.empty())
31
                    continue;
32
            }
33

34
            std::string text = simodo::inout::toU8(n.token().token());
35

36
            simodo::engine::replaceAll(text, "\\", "\\\\");
37
            simodo::engine::replaceAll(text, "{", "\\{");
38
            simodo::engine::replaceAll(text, "}", "\\}");
39
            simodo::engine::replaceAll(text, ">", "\\>");
40
            simodo::engine::replaceAll(text, "<", "\\<");
41
            simodo::engine::replaceAll(text, "\"", "\\\"");
42
            simodo::engine::replaceAll(text, "|", "\\|");
43

44
            dot << "\tS" << &n
45
                   ;
46

47
            if (!substitute_text.empty())
48
                dot << "[fillcolor=\"gold\", label=\"{"
49
                    << substitute_text
50
                       ;
51
            else 
52
                dot << ((n.operation() == 0 || n.operation() >= 1000) 
53
                       ? "[label=\"{"
54
                       : "[fillcolor=\"lightgreen\", label=\"{")
55
                    << simodo::inout::toU8(n.host())
56
                    << " | " << n.operation()
57
                    << " | " << text
58
                       ;
59

60
            dot << "}\"]"
61
                << ";" << std::endl;
62

63
            generateDotBoxes(n, dot, excluded_nodes);
64
        }
65
    }
66

67
    void generateDotLines(const simodo::ast::Node & node, std::ostream & dot, const std::map<simodo::ast::OperationCode,std::string> &excluded_nodes)
68
    {
69
        int i = 1;
70
        for(const simodo::ast::Node & n : node.branches())
71
        {
72
            if (auto it=excluded_nodes.find(n.operation()); it != excluded_nodes.end()) {
73
                if (it->second.empty())
74
                    continue;
75
            }
76
            dot << "\tS" << &node << " -> S" << &n
77
                << ";" << std::endl;
78

79
            generateDotLines(n, dot, excluded_nodes);
80
            ++i;
81
        }
82
    }
83
}
84

85
namespace simodo::engine
86
{
87
    void generateDotFile(const std::string & dot_file_name,
88
                        const ast::Node & node,
89
                        const std::map<ast::OperationCode,std::string> &excluded_nodes)
90
    {
91
        std::ofstream dot(dot_file_name);
92

93
        if (dot.bad())
94
        {
95
            std::cout << "Не удалось записать в файл '" << dot_file_name << "'" << std::endl;
96
            return;
97
        }
98

99
        dot << "digraph \"" << dot_file_name << "\" { rankdir=\"LR\";" << std::endl;
100
        dot << "\t" << "node [ shape=record, fontsize=12, style=\"rounded,filled\", width=0, height=0 ];" << std::endl;
101
        dot << "\t" << "edge [ arrowsize=0.7 ];" << std::endl;
102
        dot << "\tS" << &node << " [shape=point]" << std::endl;
103

104
        generateDotBoxes(node, dot, excluded_nodes);
105
        generateDotLines(node, dot, excluded_nodes);
106

107
        dot << "}" << std::endl;
108
    }
109

110
}

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.