38 TokenSequence(
const TokenSequence &that) { CopyAll(that); }
40 const TokenSequence &that, std::size_t at, std::size_t count = 1) {
41 AppendRange(that, at, count);
43 TokenSequence(TokenSequence &&that)
44 : start_{std::move(that.start_)}, nextStart_{that.nextStart_},
45 char_{std::move(that.char_)},
46 provenances_{std::move(that.provenances_)} {}
47 TokenSequence(
const std::string &s,
Provenance p) { Put(s, p); }
49 TokenSequence &operator=(
const TokenSequence &that) {
54 TokenSequence &operator=(TokenSequence &&that);
55 bool empty()
const {
return start_.empty(); }
59 void swap(TokenSequence &);
61 std::size_t SizeInTokens()
const {
return start_.size(); }
62 std::size_t SizeInChars()
const {
return char_.size(); }
67 std::string ToString()
const {
return ToCharBlock().ToString(); }
69 CharBlock TokenAt(std::size_t token)
const {
70 if (
auto bytes{TokenBytes(token)}) {
71 return {&char_[start_.at(token)], bytes};
76 char CharAt(std::size_t j)
const {
return char_.at(j); }
78 return {&char_[nextStart_], char_.size() - nextStart_};
81 std::size_t SkipBlanks(std::size_t)
const;
82 std::optional<std::size_t> SkipBlanksBackwards(std::size_t)
const;
86 bool IsAnythingLeft(std::size_t)
const;
88 void PutNextTokenChar(
char ch,
Provenance provenance) {
89 char_.emplace_back(ch);
90 provenances_.Put({provenance, 1});
94 start_.emplace_back(nextStart_);
95 nextStart_ = char_.size();
98 void ReopenLastToken() {
99 nextStart_ = start_.back();
106 void Put(
const char *, std::size_t,
Provenance);
109 void Put(llvm::raw_string_ostream &,
Provenance);
114 void CopyAll(
const TokenSequence &);
119 const TokenSequence &, std::size_t at, std::size_t tokens = 1);
121 void CopyWithProvenance(
const TokenSequence &, ProvenanceRange);
123 Provenance GetCharProvenance(std::size_t)
const;
125 std::size_t token, std::size_t offset = 0)
const;
126 ProvenanceRange GetTokenProvenanceRange(
127 std::size_t token, std::size_t offset = 0)
const;
128 ProvenanceRange GetIntervalProvenanceRange(
129 std::size_t token, std::size_t tokens = 1)
const;
130 ProvenanceRange GetProvenanceRange()
const;
132 char *GetMutableCharData() {
return &char_[0]; }
133 TokenSequence &ToLowerCase();
134 bool HasBlanks(std::size_t firstChar = 0)
const;
135 bool HasRedundantBlanks(std::size_t firstChar = 0)
const;
136 TokenSequence &RemoveBlanks(std::size_t firstChar = 0);
137 TokenSequence &RemoveRedundantBlanks(std::size_t firstChar = 0);
138 TokenSequence &ClipComment(
const Prescanner &,
bool skipFirst =
false);
139 const TokenSequence &CheckBadFortranCharacters(
141 bool BadlyNestedParentheses()
const;
142 const TokenSequence &CheckBadParentheses(
Messages &)
const;
144 llvm::raw_ostream &Dump(llvm::raw_ostream &)
const;
147 std::size_t TokenBytes(std::size_t token)
const {
148 return (token + 1 >= start_.size() ? char_.size() : start_[token + 1]) -
152 std::vector<std::size_t> start_;
153 std::size_t nextStart_{0};
154 std::vector<char> char_;