/proc/self/cwd/external/antlr4-cpp-runtime~/runtime/src/CommonTokenStream.cpp
Line | Count | Source |
1 | | /* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. |
2 | | * Use of this file is governed by the BSD 3-clause license that |
3 | | * can be found in the LICENSE.txt file in the project root. |
4 | | */ |
5 | | |
6 | | #include "Token.h" |
7 | | |
8 | | #include "CommonTokenStream.h" |
9 | | |
10 | | using namespace antlr4; |
11 | | |
12 | 4.20k | CommonTokenStream::CommonTokenStream(TokenSource *tokenSource) : CommonTokenStream(tokenSource, Token::DEFAULT_CHANNEL) { |
13 | 4.20k | } |
14 | | |
15 | | CommonTokenStream::CommonTokenStream(TokenSource *tokenSource, size_t channel_) |
16 | 4.20k | : BufferedTokenStream(tokenSource), channel(channel_) { |
17 | 4.20k | } |
18 | | |
19 | 29.5M | ssize_t CommonTokenStream::adjustSeekIndex(size_t i) { |
20 | 29.5M | return nextTokenOnChannel(i, channel); |
21 | 29.5M | } |
22 | | |
23 | 25.3M | Token* CommonTokenStream::LB(size_t k) { |
24 | 25.3M | if (k == 0 || k > _p) { |
25 | 2.37k | return nullptr; |
26 | 2.37k | } |
27 | | |
28 | 25.3M | ssize_t i = static_cast<ssize_t>(_p); |
29 | 25.3M | size_t n = 1; |
30 | | // find k good tokens looking backwards |
31 | 50.6M | while (n <= k) { |
32 | | // skip off-channel tokens |
33 | 25.3M | i = previousTokenOnChannel(i - 1, channel); |
34 | 25.3M | n++; |
35 | 25.3M | } |
36 | 25.3M | if (i < 0) { |
37 | 970 | return nullptr; |
38 | 970 | } |
39 | | |
40 | 25.3M | return _tokens[i].get(); |
41 | 25.3M | } |
42 | | |
43 | 109M | Token* CommonTokenStream::LT(ssize_t k) { |
44 | 109M | lazyInit(); |
45 | 109M | if (k == 0) { |
46 | 0 | return nullptr; |
47 | 0 | } |
48 | 109M | if (k < 0) { |
49 | 25.3M | return LB(static_cast<size_t>(-k)); |
50 | 25.3M | } |
51 | 84.6M | size_t i = _p; |
52 | 84.6M | ssize_t n = 1; // we know tokens[p] is a good one |
53 | | // find k good tokens |
54 | 84.6M | while (n < k) { |
55 | | // skip off-channel tokens, but make sure to not look past EOF |
56 | 14.2k | if (sync(i + 1)) { |
57 | 10.0k | i = nextTokenOnChannel(i + 1, channel); |
58 | 10.0k | } |
59 | 14.2k | n++; |
60 | 14.2k | } |
61 | | |
62 | 84.6M | return _tokens[i].get(); |
63 | 109M | } |
64 | | |
65 | 0 | int CommonTokenStream::getNumberOfOnChannelTokens() { |
66 | 0 | int n = 0; |
67 | 0 | fill(); |
68 | 0 | for (size_t i = 0; i < _tokens.size(); i++) { |
69 | 0 | Token *t = _tokens[i].get(); |
70 | 0 | if (t->getChannel() == channel) { |
71 | 0 | n++; |
72 | 0 | } |
73 | 0 | if (t->getType() == Token::EOF) { |
74 | 0 | break; |
75 | 0 | } |
76 | 0 | } |
77 | 0 | return n; |
78 | 0 | } |