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 23 namespace clang { 24 class SourceManager; 25 26 namespace comments { 27 class CommandTraits; 28 29 /// Doxygen comment parser. 30 class 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.back(); 66 MoreLATokens.pop_back(); 67 } 68 } 69 70 void putBack(const Token &OldTok) { 71 MoreLATokens.push_back(Tok); 72 Tok = OldTok; 73 } 74 75 void putBack(ArrayRef<Token> Toks) { 76 if (Toks.empty()) 77 return; 78 79 MoreLATokens.push_back(Tok); 80 for (const Token *I = &Toks.back(), 81 *B = &Toks.front(); 82 I != B; --I) { 83 MoreLATokens.push_back(*I); 84 } 85 86 Tok = Toks[0]; 87 } 88 89 bool isTokBlockCommand() { 90 return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) && 91 Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand; 92 } 93 94 public: 95 Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator, 96 const SourceManager &SourceMgr, DiagnosticsEngine &Diags, 97 const CommandTraits &Traits); 98 99 /// Parse arguments for \\param command. 100 void parseParamCommandArgs(ParamCommandComment *PC, 101 TextTokenRetokenizer &Retokenizer); 102 103 /// Parse arguments for \\tparam command. 104 void parseTParamCommandArgs(TParamCommandComment *TPC, 105 TextTokenRetokenizer &Retokenizer); 106 107 void parseBlockCommandArgs(BlockCommandComment *BC, 108 TextTokenRetokenizer &Retokenizer, 109 unsigned NumArgs); 110 111 BlockCommandComment *parseBlockCommand(); 112 InlineCommandComment *parseInlineCommand(); 113 114 HTMLStartTagComment *parseHTMLStartTag(); 115 HTMLEndTagComment *parseHTMLEndTag(); 116 117 BlockContentComment *parseParagraphOrBlockCommand(); 118 119 VerbatimBlockComment *parseVerbatimBlock(); 120 VerbatimLineComment *parseVerbatimLine(); 121 BlockContentComment *parseBlockContent(); 122 FullComment *parseFullComment(); 123 }; 124 125 } // end namespace comments 126 } // end namespace clang 127 128 #endif 129 130