|
9
|
1 /*
|
|
|
2 ** Copyright (c) 2014-2017, Eren Okka
|
|
|
3 **
|
|
|
4 ** This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
5 ** License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
6 ** file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
7 */
|
|
|
8
|
|
|
9 #pragma once
|
|
|
10
|
|
|
11 #include <vector>
|
|
|
12
|
|
|
13 #include "string.h"
|
|
|
14
|
|
|
15 namespace anitomy {
|
|
|
16
|
|
|
17 enum TokenCategory { kUnknown, kBracket, kDelimiter, kIdentifier, kInvalid };
|
|
|
18
|
|
|
19 enum TokenFlag {
|
|
|
20 kFlagNone,
|
|
|
21 // Categories
|
|
|
22 kFlagBracket = 1 << 0,
|
|
|
23 kFlagNotBracket = 1 << 1,
|
|
|
24 kFlagDelimiter = 1 << 2,
|
|
|
25 kFlagNotDelimiter = 1 << 3,
|
|
|
26 kFlagIdentifier = 1 << 4,
|
|
|
27 kFlagNotIdentifier = 1 << 5,
|
|
|
28 kFlagUnknown = 1 << 6,
|
|
|
29 kFlagNotUnknown = 1 << 7,
|
|
|
30 kFlagValid = 1 << 8,
|
|
|
31 kFlagNotValid = 1 << 9,
|
|
|
32 // Enclosed
|
|
|
33 kFlagEnclosed = 1 << 10,
|
|
|
34 kFlagNotEnclosed = 1 << 11,
|
|
|
35 // Masks
|
|
|
36 kFlagMaskCategories = kFlagBracket | kFlagNotBracket | kFlagDelimiter | kFlagNotDelimiter | kFlagIdentifier |
|
|
|
37 kFlagNotIdentifier | kFlagUnknown | kFlagNotUnknown | kFlagValid | kFlagNotValid,
|
|
|
38 kFlagMaskEnclosed = kFlagEnclosed | kFlagNotEnclosed,
|
|
|
39 };
|
|
|
40
|
|
|
41 struct TokenRange {
|
|
|
42 size_t offset = 0;
|
|
|
43 size_t size = 0;
|
|
|
44 };
|
|
|
45
|
|
|
46 class Token {
|
|
|
47 public:
|
|
|
48 Token();
|
|
|
49 Token(TokenCategory category, const string_t& content, bool enclosed);
|
|
|
50
|
|
|
51 bool operator==(const Token& token) const;
|
|
|
52
|
|
|
53 TokenCategory category;
|
|
|
54 string_t content;
|
|
|
55 bool enclosed;
|
|
|
56 };
|
|
|
57
|
|
|
58 using token_container_t = std::vector<Token>;
|
|
|
59 using token_iterator_t = token_container_t::iterator;
|
|
|
60 using token_reverse_iterator_t = token_container_t::reverse_iterator;
|
|
|
61
|
|
|
62 token_iterator_t FindToken(token_iterator_t first, token_iterator_t last, unsigned int flags);
|
|
|
63 token_reverse_iterator_t FindToken(token_reverse_iterator_t first, token_reverse_iterator_t last, unsigned int flags);
|
|
|
64 token_iterator_t FindPreviousToken(token_container_t& tokens, token_iterator_t first, unsigned int flags);
|
|
|
65 token_iterator_t FindNextToken(token_container_t& tokens, token_iterator_t first, unsigned int flags);
|
|
|
66
|
|
|
67 } // namespace anitomy
|