mimic++ v9.2.1
Loading...
Searching...
No Matches
NameParserTokens.hpp
Go to the documentation of this file.
1// Copyright Dominic (DNKpp) Koepke 2024 - 2025.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// https://www.boost.org/LICENSE_1_0.txt)
5
6#ifndef MIMICPP_PRINTING_TYPE_NAME_PARSER_TOKENS_HPP
7#define MIMICPP_PRINTING_TYPE_NAME_PARSER_TOKENS_HPP
8
9#include "mimic++/Fwd.hpp"
12
13#ifndef MIMICPP_DETAIL_IS_MODULE
14 #include <concepts>
15 #include <functional>
16 #include <memory>
17 #include <optional>
18 #include <ranges>
19 #include <type_traits>
20 #include <variant>
21 #include <vector>
22#endif
23
25{
26 template <typename T>
27 concept parser_visitor = std::movable<T>
28 && requires(std::unwrap_reference_t<T> visitor, StringViewT content, std::ptrdiff_t count) {
29 visitor.unrecognized(content);
30
31 visitor.begin();
32 visitor.end();
33
34 visitor.begin_type();
35 visitor.end_type();
36
37 visitor.begin_scope();
38 visitor.end_scope();
39
40 visitor.add_identifier(content);
41 visitor.add_arg();
42
43 visitor.begin_template_args(count);
44 visitor.end_template_args();
45
46 visitor.add_const();
47 visitor.add_volatile();
48 visitor.add_noexcept();
49 visitor.add_ptr();
50 visitor.add_lvalue_ref();
51 visitor.add_rvalue_ref();
52
53 visitor.begin_function();
54 visitor.end_function();
55 visitor.begin_return_type();
56 visitor.end_return_type();
57 visitor.begin_function_args(count);
58 visitor.end_function_args();
59
60 visitor.begin_function_ptr();
61 visitor.end_function_ptr();
62
63 visitor.begin_operator_identifier();
64 visitor.end_operator_identifier();
65 };
66
67 template <parser_visitor Visitor>
68 [[nodiscard]]
69 constexpr auto& unwrap_visitor(Visitor& visitor) noexcept
70 {
71 return static_cast<
72 std::add_lvalue_reference_t<
73 std::unwrap_reference_t<Visitor>>>(visitor);
74 }
75}
76
78{
79 class Type;
80
81 class Space
82 {
83 };
84
86 {
87 };
88
90 {
91 public:
93 };
94
96 {
97 public:
99 };
100
102 {
103 public:
105 };
106
108 {
109 public:
111 };
112
114 {
115 public:
117 };
118
120 {
121 public:
123 };
124
126 {
127 public:
129 };
130
132 {
133 public:
135 };
136
138 {
139 public:
141 };
142
144 {
145 public:
147 };
148
150 {
151 public:
153 };
154
155 class Specs
156 {
157 public:
158 struct Layer
159 {
160 bool isConst{false};
161 bool isVolatile{false};
162
163 template <parser_visitor Visitor>
164 constexpr void operator()(Visitor& visitor) const
165 {
166 auto& inner = unwrap_visitor(visitor);
167
168 if (isConst)
169 {
170 inner.add_const();
171 }
172
173 if (isVolatile)
174 {
175 inner.add_volatile();
176 }
177 }
178 };
179
180 std::vector<Layer> layers{1u};
181
182 enum Refness : std::uint8_t
183 {
187 };
188
190 bool isNoexcept{false};
191
192 [[nodiscard]]
194 {
195 return 1u < layers.size();
196 }
197
198 template <parser_visitor Visitor>
199 constexpr void operator()(Visitor& visitor) const
200 {
201 MIMICPP_ASSERT(!layers.empty(), "Invalid state.");
202
203 auto& unwrapped = unwrap_visitor(visitor);
204
205 std::invoke(layers.front(), unwrapped);
206
207 for (auto const& layer : layers | std::views::drop(1u))
208 {
209 unwrapped.add_ptr();
210 std::invoke(layer, unwrapped);
211 }
212
213 switch (refness)
214 {
215 case lvalue:
216 unwrapped.add_lvalue_ref();
217 break;
218
219 case rvalue:
220 unwrapped.add_rvalue_ref();
221 break;
222
223 case none: [[fallthrough]];
224 default: break;
225 }
226
227 if (isNoexcept)
228 {
229 unwrapped.add_noexcept();
230 }
231 }
232 };
233
235 {
236 public:
237 std::vector<Type> types;
238
245
246 template <parser_visitor Visitor>
247 constexpr void operator()(Visitor& visitor) const;
248
249 template <parser_visitor Visitor>
250 constexpr void handle_as_template_args(Visitor& visitor) const;
251 };
252
254 {
255 public:
256 bool isBuiltinType{false};
257
259 {
260 using Symbol = std::variant<StringViewT, std::shared_ptr<Type>>;
262 };
263
264 using Content = std::variant<StringViewT, OperatorInfo>;
266 std::optional<ArgSequence> templateArgs{};
267
268 [[nodiscard]]
269 constexpr bool is_template() const noexcept
270 {
271 return templateArgs.has_value();
272 }
273
274 [[nodiscard]]
275 constexpr bool is_void() const noexcept
276 {
277 auto const* const id = std::get_if<StringViewT>(&content);
278
279 return id
280 && "void" == *id;
281 }
282
283 [[nodiscard]]
284 constexpr bool is_reserved() const noexcept
285 {
286 auto const* const id = std::get_if<StringViewT>(&content);
287
288 return id
289 && id->starts_with("__");
290 }
291
292 [[nodiscard]]
293 constexpr bool is_builtin() const noexcept
294 {
295 return isBuiltinType;
296 }
297
298 template <parser_visitor Visitor>
299 constexpr void operator()(Visitor& visitor) const
300 {
301 auto& unwrapped = unwrap_visitor(visitor);
302
303 std::visit(
304 [&](auto const& inner) { handle_content(unwrapped, inner); },
305 content);
306
307 if (templateArgs)
308 {
309 templateArgs->handle_as_template_args(unwrapped);
310 }
311 }
312
313 public:
314 template <parser_visitor Visitor>
315 static constexpr void handle_content(Visitor& visitor, StringViewT const& content)
316 {
317 MIMICPP_ASSERT(!content.empty(), "Empty identifier is not allowed.");
318
319 visitor.add_identifier(content);
320 }
321
322 template <parser_visitor Visitor>
323 static constexpr void handle_content(Visitor& visitor, OperatorInfo const& content)
324 {
325 visitor.begin_operator_identifier();
326 std::visit(
327 [&](auto const& symbol) { handle_op_symbol(visitor, symbol); },
328 content.symbol);
329 visitor.end_operator_identifier();
330 }
331
332 template <parser_visitor Visitor>
333 static constexpr void handle_op_symbol(Visitor& visitor, StringViewT const& symbol)
334 {
335 MIMICPP_ASSERT(!symbol.empty(), "Empty symbol is not allowed.");
336
337 visitor.add_identifier(symbol);
338 }
339
340 template <parser_visitor Visitor>
341 static constexpr void handle_op_symbol(Visitor& visitor, std::shared_ptr<Type> const& type)
342 {
343 MIMICPP_ASSERT(type, "Empty type-symbol is not allowed.");
344
345 std::invoke(*type, visitor);
346 }
347 };
348
350 {
351 public:
354
355 template <parser_visitor Visitor>
356 constexpr void operator()(Visitor& visitor) const;
357 };
358
360 {
361 public:
364
365 template <parser_visitor Visitor>
366 constexpr void operator()(Visitor& visitor) const
367 {
368 auto& unwrapped = unwrap_visitor(visitor);
369
370 std::invoke(identifier, unwrapped);
371 std::invoke(context, unwrapped);
372 }
373 };
374
376 {
377 public:
378 using Scope = std::variant<Identifier, FunctionIdentifier>;
379 std::vector<Scope> scopes{};
380
381 template <parser_visitor Visitor>
382 constexpr void operator()(Visitor& visitor) const
383 {
384 MIMICPP_ASSERT(!scopes.empty(), "Empty scope-sequence is not allowed.");
385
386 auto& unwrapped = unwrap_visitor(visitor);
387
388 for (auto const& scope : scopes)
389 {
390 unwrapped.begin_scope();
391 std::visit(
392 [&](auto const& id) { handle_scope(unwrapped, id); },
393 scope);
394 unwrapped.end_scope();
395 }
396 }
397
398 private:
399 template <parser_visitor Visitor>
400 constexpr void handle_scope(Visitor& visitor, Identifier const& scope) const
401 {
402 std::invoke(scope, visitor);
403 }
404
405 template <parser_visitor Visitor>
406 constexpr void handle_scope(Visitor& visitor, FunctionIdentifier const& scope) const
407 {
408 visitor.begin_function();
409 std::invoke(scope, visitor);
410 visitor.end_function();
411 }
412 };
413
415 {
416 public:
417 std::optional<ScopeSequence> scopes{};
420
421 template <parser_visitor Visitor>
422 constexpr void operator()(Visitor& visitor) const
423 {
424 auto& unwrapped = unwrap_visitor(visitor);
425
426 unwrapped.begin_type();
427
428 if (scopes)
429 {
430 std::invoke(*scopes, unwrapped);
431 }
432
433 std::invoke(identifier, unwrapped);
434 std::invoke(specs, unwrapped);
435
436 unwrapped.end_type();
437 }
438 };
439
441 {
442 public:
443 std::shared_ptr<Type> returnType{};
445
446 template <parser_visitor Visitor>
447 void operator()(Visitor& visitor) const
448 {
449 MIMICPP_ASSERT(returnType, "Return type is mandatory for function-types.");
450
451 auto& unwrapped = unwrap_visitor(visitor);
452
453 unwrapped.begin_function();
454
455 unwrapped.begin_return_type();
456 std::invoke(*returnType, visitor);
457 unwrapped.end_return_type();
458
459 std::invoke(context, unwrapped);
460
461 unwrapped.end_function();
462 }
463 };
464
466 {
467 public:
468 std::optional<ScopeSequence> scopes{};
470
472 {
473 std::shared_ptr<FunctionPtr> ptr{};
475 };
476
477 std::optional<NestedInfo> nested{};
478 };
479
481 {
482 public:
483 std::shared_ptr<Type> returnType{};
484 std::optional<ScopeSequence> scopes{};
487
488 template <parser_visitor Visitor>
489 constexpr void operator()(Visitor& visitor) const
490 {
491 MIMICPP_ASSERT(returnType, "Return type is mandatory for function-ptrs.");
492
493 auto& unwrapped = unwrap_visitor(visitor);
494
495 unwrapped.begin_type();
496
497 unwrapped.begin_return_type();
498 std::invoke(*returnType, visitor);
499 unwrapped.end_return_type();
500
501 unwrapped.begin_function_ptr();
502 if (scopes)
503 {
504 std::invoke(*scopes, unwrapped);
505 }
506
507 std::invoke(specs, unwrapped);
508 unwrapped.end_function_ptr();
509
510 std::invoke(context, unwrapped);
511
512 unwrapped.end_type();
513 }
514 };
515
516 class Type
517 {
518 public:
519 using State = std::variant<RegularType, FunctionType, FunctionPtrType>;
521
522 [[nodiscard]]
523 constexpr bool is_void() const noexcept
524 {
525 auto const* const regularType = std::get_if<RegularType>(&state);
526
527 return regularType
528 && regularType->identifier.is_void();
529 }
530
531 [[nodiscard]]
532 constexpr Specs& specs() noexcept
533 {
534 return std::visit(
535 [&](auto& inner) noexcept -> Specs& { return specs(inner); },
536 state);
537 }
538
539 template <parser_visitor Visitor>
540 void operator()(Visitor& visitor) const
541 {
542 auto& unwrapped = unwrap_visitor(visitor);
543
544 std::visit(
545 [&](auto const& inner) { std::invoke(inner, unwrapped); },
546 state);
547 }
548
549 private:
550 [[nodiscard]]
551 static constexpr Specs& specs(RegularType& type) noexcept
552 {
553 return type.specs;
554 }
555
556 [[nodiscard]]
557 static constexpr Specs& specs(FunctionType& type) noexcept
558 {
559 return type.context.specs;
560 }
561
562 [[nodiscard]]
563 static constexpr Specs& specs(FunctionPtrType& type) noexcept
564 {
565 return type.specs;
566 }
567 };
568
574 MIMICPP_DETAIL_CONSTEXPR_VECTOR ArgSequence& ArgSequence::operator=(ArgSequence&&) noexcept = default;
575
576 template <parser_visitor Visitor>
577 constexpr void ArgSequence::operator()(Visitor& visitor) const
578 {
579 if (!types.empty())
580 {
581 auto& unwrapped = unwrap_visitor(visitor);
582
583 std::invoke(types.front(), unwrapped);
584
585 for (auto const& type : types | std::views::drop(1))
586 {
587 unwrapped.add_arg();
588 std::invoke(type, unwrapped);
589 }
590 }
591 }
592
593 template <parser_visitor Visitor>
594 constexpr void ArgSequence::handle_as_template_args(Visitor& visitor) const
595 {
596 auto& unwrapped = unwrap_visitor(visitor);
597
598 unwrapped.begin_template_args(std::ranges::ssize(types));
599 std::invoke(*this, unwrapped);
600 unwrapped.end_template_args();
601 }
602
603 template <parser_visitor Visitor>
604 constexpr void FunctionContext::operator()(Visitor& visitor) const
605 {
606 auto& unwrapped = unwrap_visitor(visitor);
607
608 unwrapped.begin_function_args(std::ranges::ssize(args.types));
609 std::invoke(args, unwrapped);
610 unwrapped.end_function_args();
611 std::invoke(specs, unwrapped);
612 }
613
615 {
616 public:
617 std::shared_ptr<Type> returnType{};
618 std::optional<ScopeSequence> scopes{};
620
621 template <parser_visitor Visitor>
622 void operator()(Visitor& visitor) const
623 {
624 auto& unwrapped = unwrap_visitor(visitor);
625
626 unwrapped.begin_function();
627
628 if (returnType)
629 {
630 unwrapped.begin_return_type();
631 std::invoke(*returnType, visitor);
632 unwrapped.end_return_type();
633 }
634
635 if (scopes)
636 {
637 std::invoke(*scopes, unwrapped);
638 }
639
640 std::invoke(identifier, unwrapped);
641
642 unwrapped.end_function();
643 }
644 };
645}
646
648{
649 using Token = std::variant<
663
673 using TokenStack = std::vector<Token>;
674
675 template <typename T>
676 concept token_type = requires(Token const& token) {
677 { std::holds_alternative<Token>(token) } -> util::boolean_testable;
678 };
679}
680
681#endif
#define MIMICPP_DETAIL_CONSTEXPR_VECTOR
Definition Config.hpp:69
#define MIMICPP_ASSERT(condition, msg)
Definition Config.hpp:51
StringViewT content
Definition NameParserTokens.hpp:98
Definition NameParserTokens.hpp:235
std::vector< Type > types
Definition NameParserTokens.hpp:237
MIMICPP_DETAIL_CONSTEXPR_VECTOR ~ArgSequence() noexcept
constexpr void handle_as_template_args(Visitor &visitor) const
Definition NameParserTokens.hpp:594
MIMICPP_DETAIL_CONSTEXPR_VECTOR ArgSequence()
StringViewT content
Definition NameParserTokens.hpp:110
StringViewT content
Definition NameParserTokens.hpp:134
StringViewT content
Definition NameParserTokens.hpp:122
StringViewT content
Definition NameParserTokens.hpp:146
Specs specs
Definition NameParserTokens.hpp:353
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:604
ArgSequence args
Definition NameParserTokens.hpp:352
Definition NameParserTokens.hpp:615
FunctionIdentifier identifier
Definition NameParserTokens.hpp:619
std::shared_ptr< Type > returnType
Definition NameParserTokens.hpp:617
std::optional< ScopeSequence > scopes
Definition NameParserTokens.hpp:618
void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:622
Identifier identifier
Definition NameParserTokens.hpp:362
FunctionContext context
Definition NameParserTokens.hpp:363
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:366
Definition NameParserTokens.hpp:466
std::optional< NestedInfo > nested
Definition NameParserTokens.hpp:477
Specs specs
Definition NameParserTokens.hpp:469
std::optional< ScopeSequence > scopes
Definition NameParserTokens.hpp:468
FunctionContext context
Definition NameParserTokens.hpp:486
Specs specs
Definition NameParserTokens.hpp:485
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:489
std::shared_ptr< Type > returnType
Definition NameParserTokens.hpp:483
std::optional< ScopeSequence > scopes
Definition NameParserTokens.hpp:484
FunctionContext context
Definition NameParserTokens.hpp:444
std::shared_ptr< Type > returnType
Definition NameParserTokens.hpp:443
void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:447
Definition NameParserTokens.hpp:254
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:299
std::variant< StringViewT, OperatorInfo > Content
Definition NameParserTokens.hpp:264
static constexpr void handle_op_symbol(Visitor &visitor, std::shared_ptr< Type > const &type)
Definition NameParserTokens.hpp:341
constexpr bool is_builtin() const noexcept
Definition NameParserTokens.hpp:293
bool isBuiltinType
Definition NameParserTokens.hpp:256
static constexpr void handle_content(Visitor &visitor, StringViewT const &content)
Definition NameParserTokens.hpp:315
constexpr bool is_template() const noexcept
Definition NameParserTokens.hpp:269
static constexpr void handle_op_symbol(Visitor &visitor, StringViewT const &symbol)
Definition NameParserTokens.hpp:333
Content content
Definition NameParserTokens.hpp:265
constexpr bool is_reserved() const noexcept
Definition NameParserTokens.hpp:284
constexpr bool is_void() const noexcept
Definition NameParserTokens.hpp:275
std::optional< ArgSequence > templateArgs
Definition NameParserTokens.hpp:266
static constexpr void handle_content(Visitor &visitor, OperatorInfo const &content)
Definition NameParserTokens.hpp:323
StringViewT content
Definition NameParserTokens.hpp:104
StringViewT content
Definition NameParserTokens.hpp:140
StringViewT content
Definition NameParserTokens.hpp:128
StringViewT content
Definition NameParserTokens.hpp:116
Definition NameParserTokens.hpp:415
std::optional< ScopeSequence > scopes
Definition NameParserTokens.hpp:417
Specs specs
Definition NameParserTokens.hpp:419
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:422
Identifier identifier
Definition NameParserTokens.hpp:418
StringViewT content
Definition NameParserTokens.hpp:92
std::vector< Scope > scopes
Definition NameParserTokens.hpp:379
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:382
std::variant< Identifier, FunctionIdentifier > Scope
Definition NameParserTokens.hpp:378
Definition NameParserTokens.hpp:82
Definition NameParserTokens.hpp:156
std::vector< Layer > layers
Definition NameParserTokens.hpp:180
MIMICPP_DETAIL_CONSTEXPR_VECTOR bool has_ptr() const noexcept
Definition NameParserTokens.hpp:193
bool isNoexcept
Definition NameParserTokens.hpp:190
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:199
Refness
Definition NameParserTokens.hpp:183
@ rvalue
Definition NameParserTokens.hpp:186
@ lvalue
Definition NameParserTokens.hpp:185
@ none
Definition NameParserTokens.hpp:184
Refness refness
Definition NameParserTokens.hpp:189
Definition NameParserTokens.hpp:150
StringViewT content
Definition NameParserTokens.hpp:152
Definition NameParserTokens.hpp:517
constexpr Specs & specs() noexcept
Definition NameParserTokens.hpp:532
State state
Definition NameParserTokens.hpp:520
constexpr bool is_void() const noexcept
Definition NameParserTokens.hpp:523
std::variant< RegularType, FunctionType, FunctionPtrType > State
Definition NameParserTokens.hpp:519
void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:540
Definition NameParserTokens.hpp:27
Definition NameParserTokens.hpp:676
Determines, whether B behaves as a the builtin type bool.
Definition Concepts.hpp:66
Definition NameParserReductions.hpp:118
Definition NameParser.hpp:27
std::variant< token::Space, token::OperatorKeyword, token::ScopeResolution, token::ArgSeparator, token::OpeningAngle, token::ClosingAngle, token::OpeningParens, token::ClosingParens, token::OpeningCurly, token::ClosingCurly, token::OpeningBacktick, token::ClosingSingleQuote, token::TypeContext, token::Identifier, token::FunctionIdentifier, token::ScopeSequence, token::ArgSequence, token::FunctionContext, token::FunctionPtr, token::Specs, token::Type, token::Function > Token
Definition NameParserTokens.hpp:649
constexpr auto & unwrap_visitor(Visitor &visitor) noexcept
Definition NameParserTokens.hpp:69
std::vector< Token > TokenStack
Definition NameParserTokens.hpp:673
Definition Fwd.hpp:54
std::basic_string_view< CharT, CharTraitsT > StringViewT
Definition Fwd.hpp:392
FunctionContext ctx
Definition NameParserTokens.hpp:474
std::shared_ptr< FunctionPtr > ptr
Definition NameParserTokens.hpp:473
std::variant< StringViewT, std::shared_ptr< Type > > Symbol
Definition NameParserTokens.hpp:260
constexpr void operator()(Visitor &visitor) const
Definition NameParserTokens.hpp:164
bool isVolatile
Definition NameParserTokens.hpp:161
bool isConst
Definition NameParserTokens.hpp:160