Skip to content

Commit 875213b

Browse files
authored
Merge pull request #42 from ruoso/sema
Transforming the parse tree into an Abstract Syntax Tree
2 parents c911686 + a526897 commit 875213b

35 files changed

+1389
-56
lines changed

.vscode/settings.json

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"files.associations": {
3+
"*.tcc": "cpp",
4+
"optional": "cpp",
5+
"system_error": "cpp",
6+
"array": "cpp",
7+
"deque": "cpp",
8+
"list": "cpp",
9+
"string": "cpp",
10+
"unordered_map": "cpp",
11+
"vector": "cpp",
12+
"string_view": "cpp",
13+
"initializer_list": "cpp",
14+
"any": "cpp",
15+
"atomic": "cpp",
16+
"bit": "cpp",
17+
"cctype": "cpp",
18+
"clocale": "cpp",
19+
"cmath": "cpp",
20+
"codecvt": "cpp",
21+
"compare": "cpp",
22+
"concepts": "cpp",
23+
"condition_variable": "cpp",
24+
"cstdarg": "cpp",
25+
"cstddef": "cpp",
26+
"cstdint": "cpp",
27+
"cstdio": "cpp",
28+
"cstdlib": "cpp",
29+
"cstring": "cpp",
30+
"ctime": "cpp",
31+
"cwchar": "cpp",
32+
"cwctype": "cpp",
33+
"map": "cpp",
34+
"set": "cpp",
35+
"exception": "cpp",
36+
"algorithm": "cpp",
37+
"functional": "cpp",
38+
"iterator": "cpp",
39+
"memory": "cpp",
40+
"memory_resource": "cpp",
41+
"numeric": "cpp",
42+
"random": "cpp",
43+
"ratio": "cpp",
44+
"tuple": "cpp",
45+
"type_traits": "cpp",
46+
"utility": "cpp",
47+
"fstream": "cpp",
48+
"future": "cpp",
49+
"iomanip": "cpp",
50+
"iosfwd": "cpp",
51+
"iostream": "cpp",
52+
"istream": "cpp",
53+
"limits": "cpp",
54+
"mutex": "cpp",
55+
"new": "cpp",
56+
"numbers": "cpp",
57+
"ostream": "cpp",
58+
"semaphore": "cpp",
59+
"sstream": "cpp",
60+
"stdexcept": "cpp",
61+
"stop_token": "cpp",
62+
"streambuf": "cpp",
63+
"thread": "cpp",
64+
"cinttypes": "cpp",
65+
"typeinfo": "cpp",
66+
"variant": "cpp"
67+
}
68+
}

CMakeLists.txt

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ project( networkprotocoldsl CXX )
44
set(CMAKE_CXX_STANDARD 20)
55
set(CMAKE_CXX_STANDARD_REQUIRED ON)
66

7-
# # Enable ThreadSanitizer for Debug builds
7+
# # Enable sanitizers for Debug builds
88
if(CMAKE_BUILD_TYPE MATCHES Debug)
9-
message(STATUS "Enabling ThreadSanitizer")
10-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
11-
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fsanitize=thread")
9+
message(STATUS "Enabling Sanitizers")
10+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=undefined")
11+
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fsanitize=address -fsanitize=undefined")
1212
endif()
1313

1414
include(FetchContent)
@@ -162,6 +162,29 @@ add_library(
162162
src/networkprotocoldsl/parser/tree/typeparametermap.hpp
163163
src/networkprotocoldsl/parser/tree/typeparametervalue.cpp
164164
src/networkprotocoldsl/parser/tree/typeparametervalue.hpp
165+
src/networkprotocoldsl/sema/analyze.cpp
166+
src/networkprotocoldsl/sema/analyze.hpp
167+
src/networkprotocoldsl/sema/partstoreadactions.cpp
168+
src/networkprotocoldsl/sema/partstoreadactions.hpp
169+
src/networkprotocoldsl/sema/partstowriteactions.cpp
170+
src/networkprotocoldsl/sema/partstowriteactions.hpp
171+
src/networkprotocoldsl/sema/support.cpp
172+
src/networkprotocoldsl/sema/support.hpp
173+
src/networkprotocoldsl/sema/ast/action.cpp
174+
src/networkprotocoldsl/sema/ast/action.hpp
175+
src/networkprotocoldsl/sema/ast/action/loop.cpp
176+
src/networkprotocoldsl/sema/ast/action/loop.hpp
177+
src/networkprotocoldsl/sema/ast/action/read.cpp
178+
src/networkprotocoldsl/sema/ast/action/read.hpp
179+
src/networkprotocoldsl/sema/ast/action/write.cpp
180+
src/networkprotocoldsl/sema/ast/action/write.hpp
181+
src/networkprotocoldsl/sema/ast/agent.cpp
182+
src/networkprotocoldsl/sema/ast/agent.hpp
183+
src/networkprotocoldsl/sema/ast/protocol.hpp
184+
src/networkprotocoldsl/sema/ast/state.cpp
185+
src/networkprotocoldsl/sema/ast/state.hpp
186+
src/networkprotocoldsl/sema/ast/transition.cpp
187+
src/networkprotocoldsl/sema/ast/transition.hpp
165188
src/networkprotocoldsl/support/mutexlockqueue.cpp
166189
src/networkprotocoldsl/support/mutexlockqueue.hpp
167190
src/networkprotocoldsl/support/notificationsignal.cpp

src/networkprotocoldsl/parser/grammar/traits.hpp

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,32 @@ using NodeVariant =
5050

5151
using TokenIterator = std::vector<lexer::Token>::const_iterator;
5252

53+
// Trait to check for the presence of the stringify method
54+
template <typename T, typename = void>
55+
struct has_stringify : std::false_type {};
56+
57+
template <typename T>
58+
struct has_stringify<T, std::void_t<decltype(std::declval<T>().stringify())>>
59+
: std::true_type {};
60+
61+
// Placeholder value
62+
constexpr const char *placeholder = "<no stringify>";
63+
5364
static int indent_level(int modify) {
5465
static int indent = 0;
5566
indent += modify;
56-
for (int i = 0; i < indent; ++i) {
57-
std::cerr << ' ';
58-
}
59-
std::cerr << '(' << indent << ") ";
6067
return indent;
6168
}
6269

70+
static std::string indent_str() {
71+
std::stringstream r;
72+
for (int i = 0; i < indent_level(0); ++i) {
73+
r << ' ';
74+
}
75+
r << "(" << indent_level(0) << ")";
76+
return r.str();
77+
}
78+
6379
static bool trace_enabled() {
6480
static bool r = getenv("GRAMMAR_TRACER") != nullptr;
6581
return r;
@@ -69,12 +85,23 @@ static bool trace_enabled() {
6985

7086
template <typename ParserContext> class Tracer {
7187
public:
72-
static void output_tokens(const TokenIterator begin,
73-
const TokenIterator end) {
88+
using TokenIterator = ParserContext::TokenIterator;
89+
static void output_tokens(TokenIterator begin, TokenIterator end) {
7490
int max = 10;
91+
std::cerr << " (" << &begin << "-" << &end << ") ";
92+
std::cerr << " [" << std::distance(begin, end) << "]:";
7593
TokenIterator b = begin;
7694
while (max > 0 && b != end) {
77-
std::cerr << " " << std::visit([&](auto t) { return t.stringify(); }, *b);
95+
std::cerr << " "
96+
<< std::visit(
97+
[&](auto t) {
98+
if constexpr (has_stringify<decltype(t)>::value) {
99+
return t.stringify();
100+
} else {
101+
return placeholder;
102+
}
103+
},
104+
*b);
78105
b++;
79106
max--;
80107
}
@@ -83,37 +110,39 @@ template <typename ParserContext> class Tracer {
83110
}
84111
}
85112

86-
using TokenIterator = ParserContext::TokenIterator;
87113
template <typename... Args>
88-
static void trace_start(const char *attempt_type, const TokenIterator &begin,
89-
const TokenIterator &end, Args... args) {
114+
static void trace_start(const char *attempt_type, TokenIterator begin,
115+
TokenIterator end, Args... args) {
90116
if (!trace_enabled())
91117
return;
92-
indent_level(1);
93-
std::cerr << "> " << attempt_type << " " << ParserContext::name << " ("
94-
<< sizeof...(args) << "):";
118+
std::cerr << indent_str() << "> " << attempt_type << " "
119+
<< ParserContext::name << " (" << sizeof...(args) << "):";
95120
output_tokens(begin, end);
96-
std::cerr << std::endl;
121+
std::cerr << std::endl << std::flush;
122+
indent_level(1);
97123
}
98124
template <typename... Args>
99-
static void trace_success(const TokenIterator &begin,
100-
const TokenIterator &end, Args... args) {
125+
static void trace_success(const char *attempt_type, TokenIterator begin,
126+
TokenIterator end, Args... args) {
101127
if (!trace_enabled())
102128
return;
103129
indent_level(-1);
104-
std::cerr << "< " << ParserContext::name << " [SUCCESS]";
130+
std::cerr << indent_str() << "< " << attempt_type << " "
131+
<< ParserContext::name << " [SUCCESS]";
105132
output_tokens(begin, end);
106-
std::cerr << std::endl;
133+
std::cerr << std::endl << std::flush;
134+
;
107135
}
108136
template <typename... Args>
109-
static void trace_fail(const TokenIterator &begin, const TokenIterator &end,
110-
Args... args) {
137+
static void trace_fail(const char *attempt_type, TokenIterator begin,
138+
TokenIterator end, Args... args) {
111139
if (!trace_enabled())
112140
return;
113141
indent_level(-1);
114-
std::cerr << "< " << ParserContext::name << " [FAIL]";
142+
std::cerr << indent_str() << "< " << attempt_type << " "
143+
<< ParserContext::name << " [FAIL]";
115144
output_tokens(begin, end);
116-
std::cerr << std::endl;
145+
std::cerr << std::endl << std::flush;
117146
}
118147
};
119148

0 commit comments

Comments
 (0)