15 #include "llvm/Support/ErrorHandling.h" 20 for (StringRef::const_iterator I = S.begin(), E = S.end(); I != E; ++I) {
31 llvm::BumpPtrAllocator &Allocator;
35 bool NoMoreInterestingTokens;
42 const char *BufferStart;
43 const char *BufferEnd;
44 const char *BufferPtr;
53 return Pos.CurToken >= Toks.size();
59 const Token &
Tok = Toks[Pos.CurToken];
61 Pos.BufferStart = Tok.
getText().begin();
62 Pos.BufferEnd = Tok.
getText().end();
63 Pos.BufferPtr = Pos.BufferStart;
68 const unsigned CharNo = Pos.BufferPtr - Pos.BufferStart;
69 return Pos.BufferStartLoc.getLocWithOffset(CharNo);
74 assert(Pos.BufferPtr != Pos.BufferEnd);
75 return *Pos.BufferPtr;
80 assert(Pos.BufferPtr != Pos.BufferEnd);
82 if (Pos.BufferPtr == Pos.BufferEnd) {
84 if (isEnd() && !addToken())
96 if (NoMoreInterestingTokens)
101 Token Newline = P.Tok;
105 NoMoreInterestingTokens =
true;
110 NoMoreInterestingTokens =
true;
114 Toks.push_back(P.Tok);
116 if (Toks.size() == 1)
121 void consumeWhitespace() {
130 void formTokenWithChars(
Token &Result,
132 const char *TokBegin,
139 Result.TextPtr =
"<UNSET>";
147 Allocator(Allocator), P(P), NoMoreInterestingTokens(
false) {
157 Position SavedPos = Pos;
161 const char *WordBegin = Pos.BufferPtr;
164 const char C = peek();
166 WordText.push_back(C);
171 const unsigned Length = WordText.size();
177 char *TextPtr = Allocator.Allocate<
char>(Length + 1);
179 memcpy(TextPtr, WordText.c_str(), Length + 1);
180 StringRef Text = StringRef(TextPtr, Length);
182 formTokenWithChars(Tok, Loc, WordBegin, Length, Text);
190 Position SavedPos = Pos;
194 const char *WordBegin = Pos.BufferPtr;
198 const char C = peek();
199 if (C == OpenDelim) {
200 WordText.push_back(C);
206 while (!Error && !isEnd()) {
208 WordText.push_back(C);
213 if (!Error && C != CloseDelim)
221 const unsigned Length = WordText.size();
222 char *TextPtr = Allocator.Allocate<
char>(Length + 1);
224 memcpy(TextPtr, WordText.c_str(), Length + 1);
225 StringRef Text = StringRef(TextPtr, Length);
227 formTokenWithChars(Tok, Loc, WordBegin,
228 Pos.BufferPtr - WordBegin, Text);
237 bool HavePartialTok =
false;
239 if (Pos.BufferPtr != Pos.BufferStart) {
240 formTokenWithChars(PartialTok, getSourceLocation(),
241 Pos.BufferPtr, Pos.BufferEnd - Pos.BufferPtr,
242 StringRef(Pos.BufferPtr,
243 Pos.BufferEnd - Pos.BufferPtr));
244 HavePartialTok =
true;
248 P.putBack(llvm::makeArrayRef(Toks.begin() + Pos.CurToken, Toks.end()));
249 Pos.CurToken = Toks.size();
252 P.putBack(PartialTok);
256 Parser::Parser(
Lexer &L,
Sema &S, llvm::BumpPtrAllocator &Allocator,
259 L(L), S(S), Allocator(Allocator), SourceMgr(SourceMgr), Diags(Diags),
297 new (Allocator.Allocate<Argument>(NumArgs)) Argument[NumArgs];
298 unsigned ParsedArgs = 0;
300 while (ParsedArgs < NumArgs && Retokenizer.
lexWord(Arg)) {
337 if (isTokBlockCommand()) {
353 if (PC || TPC || Info->
NumArgs > 0) {
370 bool EmptyParagraph =
false;
371 if (isTokBlockCommand())
372 EmptyParagraph =
true;
376 EmptyParagraph = isTokBlockCommand();
387 Paragraph = cast<ParagraphComment>(Block);
405 const Token CommandTok = Tok;
411 bool ArgTokValid = Retokenizer.
lexWord(ArgTok);
416 CommandTok.getEndLocation(),
417 CommandTok.getCommandID(),
423 CommandTok.getEndLocation(),
424 CommandTok.getCommandID());
454 diag::warn_doc_html_start_tag_expected_quoted_string)
493 diag::warn_doc_html_start_tag_expected_ident_or_greater);
514 bool StartLineInvalid;
522 if (StartLineInvalid || EndLineInvalid || StartLine == EndLine)
524 diag::warn_doc_html_start_tag_expected_ident_or_greater)
525 << HST->getSourceRange();
528 diag::warn_doc_html_start_tag_expected_ident_or_greater);
529 Diag(HST->getLocation(), diag::note_doc_html_tag_started_here)
530 << HST->getSourceRange();
539 Token TokEndTag = Tok;
549 TokEndTag.getHTMLTagEndName());
573 if (Content.size() == 0)
579 diag::warn_verbatim_block_end_without_start)
607 Token WhitespaceTok = Tok;
614 putBack(WhitespaceTok);
616 if (Content.size() > 0)
617 Content.back()->addTrailingNewline();
645 llvm_unreachable(
"should not see this token");
682 Lines.push_back(Line);
714 TextBegin = NameTok.getEndLocation();
719 NameTok.getVerbatimLineID(),
752 llvm_unreachable(
"should not see this token");
754 llvm_unreachable(
"bogus token kind");
Defines the SourceManager interface.
LLVM_READONLY bool isWhitespace(unsigned char c)
Return true if this character is horizontal or vertical ASCII whitespace: ' ', '\t', '\f', '\v', '\n', '\r'.
Concrete class used by the front-end to report problems and issues.
const AnnotatedLine * Line
unsigned getPresumedLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
Encodes a location in the source.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Dataflow Directional Tag Classes.
A trivial tuple used to represent a source range.
This class handles loading and caching of source files into memory.