37 TokenSequence(
const TokenSequence &that) { CopyAll(that); }
39 const TokenSequence &that, std::size_t at, std::size_t count = 1) {
40 AppendRange(that, at, count);
42 TokenSequence(TokenSequence &&that)
43 : start_{std::move(that.start_)}, nextStart_{that.nextStart_},
44 char_{std::move(that.char_)},
45 provenances_{std::move(that.provenances_)} {}
46 TokenSequence(
const std::string &s,
Provenance p) { Put(s, p); }
48 TokenSequence &operator=(
const TokenSequence &that) {
53 TokenSequence &operator=(TokenSequence &&that);
54 bool empty()
const {
return start_.empty(); }
58 void swap(TokenSequence &);
60 std::size_t SizeInTokens()
const {
return start_.size(); }
61 std::size_t SizeInChars()
const {
return char_.size(); }
66 std::string ToString()
const {
return ToCharBlock().ToString(); }
68 CharBlock TokenAt(std::size_t token)
const {
69 if (
auto bytes{TokenBytes(token)}) {
70 return {&char_[start_.at(token)], bytes};
75 char CharAt(std::size_t j)
const {
return char_.at(j); }
77 return {&char_[nextStart_], char_.size() - nextStart_};
80 std::size_t SkipBlanks(std::size_t)
const;
81 std::optional<std::size_t> SkipBlanksBackwards(std::size_t)
const;
85 bool IsAnythingLeft(std::size_t)
const;
87 void PutNextTokenChar(
char ch,
Provenance provenance) {
88 char_.emplace_back(ch);
89 provenances_.Put({provenance, 1});
93 start_.emplace_back(nextStart_);
94 nextStart_ = char_.size();
97 void ReopenLastToken() {
98 nextStart_ = start_.back();
105 void Put(
const char *, std::size_t,
Provenance);
108 void Put(llvm::raw_string_ostream &,
Provenance);
113 void CopyAll(
const TokenSequence &);
118 const TokenSequence &, std::size_t at, std::size_t tokens = 1);
120 void CopyWithProvenance(
const TokenSequence &, ProvenanceRange);
122 Provenance GetCharProvenance(std::size_t)
const;
124 std::size_t token, std::size_t offset = 0)
const;
125 ProvenanceRange GetTokenProvenanceRange(
126 std::size_t token, std::size_t offset = 0)
const;
127 ProvenanceRange GetIntervalProvenanceRange(
128 std::size_t token, std::size_t tokens = 1)
const;
129 ProvenanceRange GetProvenanceRange()
const;
131 char *GetMutableCharData() {
return &char_[0]; }
132 TokenSequence &ToLowerCase();
133 bool HasBlanks(std::size_t firstChar = 0)
const;
134 bool HasRedundantBlanks(std::size_t firstChar = 0)
const;
135 TokenSequence &RemoveBlanks(std::size_t firstChar = 0);
136 TokenSequence &RemoveRedundantBlanks(std::size_t firstChar = 0);
137 TokenSequence &ClipComment(
const Prescanner &,
bool skipFirst =
false);
138 const TokenSequence &CheckBadFortranCharacters(
140 bool BadlyNestedParentheses()
const;
141 const TokenSequence &CheckBadParentheses(
Messages &)
const;
143 llvm::raw_ostream &Dump(llvm::raw_ostream &)
const;
146 std::size_t TokenBytes(std::size_t token)
const {
147 return (token + 1 >= start_.size() ? char_.size() : start_[token + 1]) -
151 std::vector<std::size_t> start_;
152 std::size_t nextStart_{0};
153 std::vector<char> char_;