Skip to content

Commit 1d9cc5e

Browse files
committed
wip
1 parent b55c276 commit 1d9cc5e

File tree

4 files changed

+73
-52
lines changed

4 files changed

+73
-52
lines changed

CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
cmake_minimum_required(VERSION 3.16) # 3.16+ because of target_precompiled_header
1717
project(aaltitoad VERSION 1.3.0)
1818
set(THREADS_PREFER_PTHREAD_FLAG ON)
19-
set(CMAKE_CXX_STANDARD 20)
19+
set(CMAKE_CXX_STANDARD 23)
2020
set(CXX_STANDARD_REQUIRED ON)
2121
set(SPDLOG_BUILD_SHARED)
2222
set(CONFIG_IN_FILE src/config.h.in)
@@ -123,6 +123,7 @@ add_library(huppaal_parser SHARED
123123
src/parser/hawk/scoped_template_builder/scoped_template_builder.cpp
124124
src/parser/hawk/scoped_template_builder/scoped_interpreter.cpp
125125
src/parser/hawk/diagnostics.cpp
126+
src/parser/hawk/compiler.cpp
126127
src/parser/hawk/huppaal/parser.cpp)
127128
target_link_libraries(huppaal_parser PUBLIC aaltitoad expr nlohmann_json::nlohmann_json)
128129

@@ -131,6 +132,7 @@ add_library(graphedit_parser SHARED
131132
src/parser/hawk/scoped_template_builder/scoped_template_builder.cpp
132133
src/parser/hawk/scoped_template_builder/scoped_interpreter.cpp
133134
src/parser/hawk/diagnostics.cpp
135+
src/parser/hawk/compiler.cpp
134136
src/parser/hawk/graphedit/parser.cpp
135137
src/parser/hawk/graphedit/model.cpp)
136138
target_link_libraries(graphedit_parser PUBLIC aaltitoad expr nlohmann_json::nlohmann_json)

src/parser/hawk/compiler.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
#include "compiler.h"
22
#include <overload>
3-
#include <variant>
43

54
namespace aaltitoad::hawk {
6-
compiler::compiler(const frontend::scanner& scanner, const frontend::parser& parser, const middleend::semantic_analyzer& analyzer, const middleend::optimizer& optimizer, const backend::generator& generator)
7-
: scanner{scanner}, parser{parser}, analyzer{analyzer}, optimizer{optimizer}, generator{generator}, symbols{}, diagnostic_factory{}
8-
{
9-
5+
compiler::compiler(
6+
std::unique_ptr<scanner_t>&& scanner,
7+
std::unique_ptr<parser_t>&& parser,
8+
std::unique_ptr<semantic_analyzer_t>&& analyzer,
9+
std::unique_ptr<optimizer_t>&& optimizer,
10+
std::unique_ptr<generator_t>&& generator)
11+
:
12+
scanner{std::move(scanner)},
13+
parser{std::move(parser)},
14+
analyzer{std::move(analyzer)},
15+
optimizer{std::move(optimizer)},
16+
generator{std::move(generator)},
17+
symbols{},
18+
diagnostic_factory{} {
1019
}
1120

1221
void compiler::add_symbols(const expr::symbol_table_t& symbols) {
@@ -17,15 +26,21 @@ namespace aaltitoad::hawk {
1726
symbols.clear();
1827
}
1928

20-
auto compiler::compile(const std::string& path) -> result<ntta_t> {
21-
auto stream = scanner.scan(*this, path);
22-
std::visit(ya::overload(
23-
[](const std::string& stream){},
24-
[](const error& err){}
25-
), stream);
26-
auto ast = parser.parse(*this, stream);
27-
auto dast = analyzer.analyze(*this, ast);
28-
optimizer.optimize(*this, dast);
29-
return generator.generate(*this, dast);
29+
auto compiler::compile(const std::string& path) -> std::expected<ntta_t, error> {
30+
auto stream = scanner->scan(*this, path);
31+
return stream.and_then([this](const auto& s){
32+
return parser->parse(*this, s);
33+
})
34+
// if(!stream.has_value())
35+
// return std::unexpected{stream.error()};
36+
// auto ast = parser->parse(*this, stream.value());
37+
// if(!ast.has_value())
38+
// return std::unexpected{ast.error()};
39+
// auto dast_r = analyzer->analyze(*this, ast.value());
40+
// if(!dast_r.has_value())
41+
// return std::unexpected{dast_r.error()};
42+
// auto dast = dast_r.value();
43+
// optimizer->optimize(*this, dast);
44+
// return generator->generate(*this, dast);
3045
}
3146
}

src/parser/hawk/compiler.h

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "ntta/tta.h"
44
#include "parser/hawk/diagnostics.h"
55
#include "symbol_table.h"
6+
#include <expected>
67
#include <string>
78

89
namespace aaltitoad::hawk {
@@ -11,54 +12,57 @@ namespace aaltitoad::hawk {
1112
struct error {
1213
diagnostic diagnostic;
1314
};
14-
template<typename ok>
15-
using result = std::variant<error, ok>; // TODO: Consider making this a simple yalibs thing
1615

17-
namespace frontend {
18-
struct scanner {
19-
virtual auto scan(compiler& ctx, const std::string& path) const noexcept -> result<std::string> = 0; // TODO: probably shouldnt be a string output...
20-
};
16+
struct scanner_t {
17+
scanner_t() = default;
18+
virtual ~scanner_t() = default;
19+
virtual auto scan(compiler& ctx, const std::string& path) const noexcept -> std::expected<std::string, error> = 0; // TODO: probably shouldnt be a string output...
20+
};
2121

22-
struct parser {
23-
virtual auto parse(compiler& ctx, const std::string& stream) const noexcept -> result<int> = 0; // TODO: Should be an AST output
24-
};
25-
}
22+
struct parser_t {
23+
parser_t() = default;
24+
virtual ~parser_t() = default;
25+
virtual auto parse(compiler& ctx, const std::string& stream) const noexcept -> std::expected<int, error> = 0; // TODO: Should be an AST output
26+
};
2627

27-
namespace middleend {
28-
struct semantic_analyzer {
29-
virtual auto analyze(compiler& ctx, const int& ast) const noexcept -> result<int> = 0; // TODO: Should be an ast output
30-
};
28+
struct semantic_analyzer_t {
29+
semantic_analyzer_t() = default;
30+
virtual ~semantic_analyzer_t() = default;
31+
virtual auto analyze(compiler& ctx, const int& ast) const noexcept -> std::expected<int, error> = 0; // TODO: Should be an ast output
32+
};
3133

32-
struct optimizer {
33-
// Note that optimizers are not allowed to return errors, but can throw exceptions.
34-
virtual void optimize(compiler& ctx, int& ast) const = 0;
35-
};
36-
}
34+
struct optimizer_t {
35+
optimizer_t() = default;
36+
virtual ~optimizer_t() = default;
37+
// Note that optimizers are not allowed to return errors, but can throw exceptions.
38+
virtual void optimize(compiler& ctx, int& ast) const = 0;
39+
};
3740

38-
namespace backend {
39-
struct generator {
40-
virtual auto generate(compiler& ctx, const int& ast) const noexcept -> result<ntta_t> = 0;
41-
};
42-
}
41+
struct generator_t {
42+
generator_t() = default;
43+
virtual ~generator_t() = default;
44+
virtual auto generate(compiler& ctx, const int& ast) const noexcept -> std::expected<ntta_t, error> = 0;
45+
};
4346

4447
class compiler {
4548
public:
46-
compiler(const frontend::scanner& scanner,
47-
const frontend::parser& parser,
48-
const middleend::semantic_analyzer& analyzer,
49-
const middleend::optimizer& optimizer,
50-
const backend::generator& generator);
49+
compiler(
50+
std::unique_ptr<scanner_t>&& scanner,
51+
std::unique_ptr<parser_t>&& parser,
52+
std::unique_ptr<semantic_analyzer_t>&& analyzer,
53+
std::unique_ptr<optimizer_t>&& optimizer,
54+
std::unique_ptr<generator_t>&& generator);
5155
void add_symbols(const expr::symbol_table_t& symbols);
5256
void clear_symbols();
5357
auto get_diagnostic_factory() -> diagnostic_factory&;
54-
auto compile(const std::string& path) -> result<ntta_t>;
58+
auto compile(const std::string& path) -> std::expected<ntta_t, error>;
5559

5660
private:
57-
const frontend::scanner& scanner;
58-
const frontend::parser& parser;
59-
const middleend::semantic_analyzer& analyzer;
60-
const middleend::optimizer& optimizer;
61-
const backend::generator& generator;
61+
std::unique_ptr<scanner_t> scanner;
62+
std::unique_ptr<parser_t> parser;
63+
std::unique_ptr<semantic_analyzer_t> analyzer;
64+
std::unique_ptr<optimizer_t> optimizer;
65+
std::unique_ptr<generator_t> generator;
6266
expr::symbol_table_t symbols;
6367
diagnostic_factory diagnostic_factory;
6468
};

src/parser/hawk/diagnostics.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace aaltitoad::hawk {
1717
// TODO: suggestion generator
1818
public:
1919
diagnostic_factory() = default;
20-
auto without_context() const -> diagnostic_factory&;
20+
auto without_context() -> diagnostic_factory&;
2121
auto with_model_key(const std::string& key) -> diagnostic_factory&;
2222
auto with_context(const std::string& element) -> diagnostic_factory&;
2323
auto with_context(const std::initializer_list<std::string>& elements) -> diagnostic_factory&;

0 commit comments

Comments
 (0)