loom

Форк
0
/
AstFormationBuilder.cpp 
134 строки · 4.5 Кб
1
/*
2
MIT License
3

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

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

9
#include "simodo/interpret/builtins/AstFormationBuilder.h"
10
#include "simodo/bormental/DrBormental.h"
11

12
namespace simodo::interpret::builtins
13
{
14
    namespace
15
    {
16
        parser::SyntaxDataCollector_null    null_data_collector;
17
    }
18

19
    AstFormationBuilder::AstFormationBuilder(inout::Reporter_abstract & reporter,
20
                        BaseInterpret_abstract & sbl_host,
21
                        variable::VariableSet_t & hosts)
22
        : _m(reporter)
23
        , _sbl_host(sbl_host)
24
        , _hosts(hosts)
25
        , _syntax_data_collector(null_data_collector)
26
    {
27
        _ast_formation_module = std::make_shared<AstFormationModule>(_hosts);
28

29
        /// \todo Пересмотреть странную передачу самого себя в свой же метод.
30
        /// PVS Studio: warn V678 An object is used as an argument to its own method.
31
        /// Consider checking the first actual argument of the 'instantiate' function.
32
        _sbl_host.importNamespace(u"ast", 
33
                                  _ast_formation_module->instantiate(_ast_formation_module), 
34
                                  inout::null_token_location);
35
    }
36

37
    AstFormationBuilder::AstFormationBuilder(inout::Reporter_abstract & reporter,
38
                        BaseInterpret_abstract & sbl_host,
39
                        variable::VariableSet_t & hosts,
40
                        parser::SyntaxDataCollector_interface & syntax_data_collector)
41
        : _m(reporter)
42
        , _sbl_host(sbl_host)
43
        , _hosts(hosts)
44
        , _syntax_data_collector(syntax_data_collector)
45
    {
46
        _ast_formation_module = std::make_shared<AstFormationModule>(_hosts);
47

48
        /// \todo Пересмотреть странную передачу самого себя в свой же метод.
49
        /// PVS Studio: warn V678 An object is used as an argument to its own method.
50
        /// Consider checking the first actual argument of the 'instantiate' function.
51
        _sbl_host.importNamespace(u"ast", 
52
                                  _ast_formation_module->instantiate(_ast_formation_module), 
53
                                  inout::null_token_location);
54
    }
55

56
    AstFormationBuilder::~AstFormationBuilder()
57
    {
58
    }
59

60
    bool AstFormationBuilder::weave(const ast::Node & code)
61
    {
62
        _sbl_host.inter().addFlowLayer(code);
63

64
        loom::FiberStatus status;
65

66
        while((status=_sbl_host.inter().executeOperation()) == loom::FiberStatus::Flow)
67
            ;
68

69
        return loom::FiberStatus::Complete == status;
70
    }
71

72
    bool AstFormationBuilder::onStart(const std::map<std::u16string, ast::Node> &handlers)
73
    {
74
        if (InterpretState::Flow != _sbl_host.before_start())
75
            return false;;
76

77
        auto it = handlers.find(u"onStart");
78

79
        if (it == handlers.end())
80
            return true;
81

82
        return weave(it->second);
83
    }
84

85
#ifdef AST_BUILDER_DEBUG
86
    bool AstFormationBuilder::onProduction(size_t ,
87
                                size_t ,
88
                                const inout::Token & production,
89
                                const std::vector<inout::Token> & pattern,
90
                                const ast::Node & action,
91
                                size_t ,
92
                                size_t )
93
#else
94
    bool AstFormationBuilder::onProduction(
95
                                const inout::Token & production,
96
                                const std::vector<inout::Token> & pattern,
97
                                const ast::Node & action)
98
#endif
99
    {
100
        if (action.branches().empty())
101
            return true;
102

103
        _ast_formation_module->setCurrentProduction(&production);
104
        _ast_formation_module->setCurrentPattern(&pattern);
105

106
        bool ok = weave(action);
107

108
        _ast_formation_module->setCurrentProduction(nullptr);
109
        _ast_formation_module->setCurrentPattern(nullptr);
110

111
        return ok;
112
    }
113

114
    void AstFormationBuilder::onTerminal(const inout::Token & token) 
115
    {
116
        _syntax_data_collector.collectToken(token);
117
    }
118

119
    bool AstFormationBuilder::onFinish(bool , const std::map<std::u16string, ast::Node> &handlers)
120
    {
121
        _sbl_host.before_finish(InterpretState::Flow);
122

123
        auto it = handlers.find(u"onFinish");
124

125
        if (it != handlers.end())
126
            if (!weave(it->second))
127
                return false;
128

129
        ast().finalize();
130

131
        return true;
132
    }
133

134
}

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

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

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

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