9#ifndef FORTRAN_PARSER_TOKEN_SEQUENCE_H_
10#define FORTRAN_PARSER_TOKEN_SEQUENCE_H_
16#include "flang/Parser/char-block.h"
17#include "flang/Parser/provenance.h"
40 const TokenSequence &that, std::size_t at, std::size_t count = 1) {
44 : start_{std::move(that.start_)}, nextStart_{that.nextStart_},
45 char_{std::move(that.char_)},
46 provenances_{std::move(that.provenances_)} {}
55 bool empty()
const {
return start_.empty(); }
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();
105 void Put(
const TokenSequence &, std::size_t at, std::size_t tokens = 1);
106 void Put(
const char *, std::size_t,
Provenance);
109 void Put(llvm::raw_string_ostream &,
Provenance);
111 Provenance GetCharProvenance(std::size_t)
const;
113 std::size_t token, std::size_t offset = 0)
const;
115 std::size_t token, std::size_t offset = 0)
const;
117 std::size_t token, std::size_t tokens = 1)
const;
120 char *GetMutableCharData() {
return &char_[0]; }
122 bool HasBlanks(std::size_t firstChar = 0)
const;
123 bool HasRedundantBlanks(std::size_t firstChar = 0)
const;
125 TokenSequence &RemoveRedundantBlanks(std::size_t firstChar = 0);
129 bool BadlyNestedParentheses()
const;
132 llvm::raw_ostream &Dump(llvm::raw_ostream &)
const;
135 std::size_t TokenBytes(std::size_t token)
const {
136 return (token + 1 >= start_.size() ? char_.size() : start_[token + 1]) -
140 std::vector<std::size_t> start_;
141 std::size_t nextStart_{0};
142 std::vector<char> char_;
Definition: char-block.h:28
Definition: provenance.h:233
Definition: message.h:319
Definition: provenance.h:112
Definition: provenance.h:52
Definition: token-sequence.h:35
Definition: check-expression.h:19