CommentParser.h revision 344472ebeded2fca2ed5013b9e87f81d09bfa908
1//===--- CommentParser.h - Doxygen comment parser ---------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the Doxygen comment parser. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_CLANG_AST_COMMENT_PARSER_H 15#define LLVM_CLANG_AST_COMMENT_PARSER_H 16 17#include "clang/AST/Comment.h" 18#include "clang/AST/CommentLexer.h" 19#include "clang/AST/CommentSema.h" 20#include "clang/Basic/Diagnostic.h" 21#include "llvm/Support/Allocator.h" 22 23namespace clang { 24class SourceManager; 25 26namespace comments { 27class CommandTraits; 28 29/// Doxygen comment parser. 30class Parser { 31 Parser(const Parser &) LLVM_DELETED_FUNCTION; 32 void operator=(const Parser &) LLVM_DELETED_FUNCTION; 33 34 friend class TextTokenRetokenizer; 35 36 Lexer &L; 37 38 Sema &S; 39 40 /// Allocator for anything that goes into AST nodes. 41 llvm::BumpPtrAllocator &Allocator; 42 43 /// Source manager for the comment being parsed. 44 const SourceManager &SourceMgr; 45 46 DiagnosticsEngine &Diags; 47 48 DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) { 49 return Diags.Report(Loc, DiagID); 50 } 51 52 const CommandTraits &Traits; 53 54 /// Current lookahead token. We can safely assume that all tokens are from 55 /// a single source file. 56 Token Tok; 57 58 /// A stack of additional lookahead tokens. 59 SmallVector<Token, 8> MoreLATokens; 60 61 void consumeToken() { 62 if (MoreLATokens.empty()) 63 L.lex(Tok); 64 else 65 Tok = MoreLATokens.pop_back_val(); 66 } 67 68 void putBack(const Token &OldTok) { 69 MoreLATokens.push_back(Tok); 70 Tok = OldTok; 71 } 72 73 void putBack(ArrayRef<Token> Toks) { 74 if (Toks.empty()) 75 return; 76 77 MoreLATokens.push_back(Tok); 78 for (const Token *I = &Toks.back(), 79 *B = &Toks.front(); 80 I != B; --I) { 81 MoreLATokens.push_back(*I); 82 } 83 84 Tok = Toks[0]; 85 } 86 87 bool isTokBlockCommand() { 88 return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) && 89 Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand; 90 } 91 92public: 93 Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator, 94 const SourceManager &SourceMgr, DiagnosticsEngine &Diags, 95 const CommandTraits &Traits); 96 97 /// Parse arguments for \\param command. 98 void parseParamCommandArgs(ParamCommandComment *PC, 99 TextTokenRetokenizer &Retokenizer); 100 101 /// Parse arguments for \\tparam command. 102 void parseTParamCommandArgs(TParamCommandComment *TPC, 103 TextTokenRetokenizer &Retokenizer); 104 105 void parseBlockCommandArgs(BlockCommandComment *BC, 106 TextTokenRetokenizer &Retokenizer, 107 unsigned NumArgs); 108 109 BlockCommandComment *parseBlockCommand(); 110 InlineCommandComment *parseInlineCommand(); 111 112 HTMLStartTagComment *parseHTMLStartTag(); 113 HTMLEndTagComment *parseHTMLEndTag(); 114 115 BlockContentComment *parseParagraphOrBlockCommand(); 116 117 VerbatimBlockComment *parseVerbatimBlock(); 118 VerbatimLineComment *parseVerbatimLine(); 119 BlockContentComment *parseBlockContent(); 120 FullComment *parseFullComment(); 121}; 122 123} // end namespace comments 124} // end namespace clang 125 126#endif 127 128