/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 | 7.55k | CommonTokenStream::CommonTokenStream(TokenSource *tokenSource) : CommonTokenStream(tokenSource, Token::DEFAULT_CHANNEL) { |
13 | 7.55k | } |
14 | | |
15 | | CommonTokenStream::CommonTokenStream(TokenSource *tokenSource, size_t channel_) |
16 | 7.55k | : BufferedTokenStream(tokenSource), channel(channel_) { |
17 | 7.55k | } |
18 | | |
19 | 41.8M | ssize_t CommonTokenStream::adjustSeekIndex(size_t i) { |
20 | 41.8M | return nextTokenOnChannel(i, channel); |
21 | 41.8M | } |
22 | | |
23 | 35.4M | Token* CommonTokenStream::LB(size_t k) { |
24 | 35.4M | if (k == 0 || k > _p) { |
25 | 3.20k | return nullptr; |
26 | 3.20k | } |
27 | | |
28 | 35.4M | ssize_t i = static_cast<ssize_t>(_p); |
29 | 35.4M | size_t n = 1; |
30 | | // find k good tokens looking backwards |
31 | 70.8M | while (n <= k) { |
32 | | // skip off-channel tokens |
33 | 35.4M | i = previousTokenOnChannel(i - 1, channel); |
34 | 35.4M | n++; |
35 | 35.4M | } |
36 | 35.4M | if (i < 0) { |
37 | 1.31k | return nullptr; |
38 | 1.31k | } |
39 | | |
40 | 35.4M | return _tokens[i].get(); |
41 | 35.4M | } |
42 | | |
43 | 154M | Token* CommonTokenStream::LT(ssize_t k) { |
44 | 154M | lazyInit(); |
45 | 154M | if (k == 0) { |
46 | 0 | return nullptr; |
47 | 0 | } |
48 | 154M | if (k < 0) { |
49 | 35.4M | return LB(static_cast<size_t>(-k)); |
50 | 35.4M | } |
51 | 118M | size_t i = _p; |
52 | 118M | ssize_t n = 1; // we know tokens[p] is a good one |
53 | | // find k good tokens |
54 | 118M | while (n < k) { |
55 | | // skip off-channel tokens, but make sure to not look past EOF |
56 | 30.6k | if (sync(i + 1)) { |
57 | 22.9k | i = nextTokenOnChannel(i + 1, channel); |
58 | 22.9k | } |
59 | 30.6k | n++; |
60 | 30.6k | } |
61 | | |
62 | 118M | return _tokens[i].get(); |
63 | 154M | } |
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 | } |