1 /* 2 * Copyright 2018 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef bmhParser_DEFINED 9 #define bmhParser_DEFINED 10 11 #include "SkCommandLineFlags.h" 12 13 #include "definition.h" 14 #include "parserCommon.h" 15 16 class BmhParser : public ParserCommon { 17 public: 18 enum class MarkLookup { 19 kRequire, 20 kAllowUnknown, 21 }; 22 23 enum class ExampleOptions { 24 kText, 25 kPng, 26 kAll 27 }; 28 29 enum class Exemplary { 30 kNo, 31 kYes, 32 kOptional, 33 }; 34 35 enum class TableState { 36 kNone, 37 kColumnStart, 38 kColumnEnd, 39 }; 40 41 enum class HasTag { 42 kNo, 43 kYes, 44 }; 45 46 enum class TrimExtract { 47 kNo, 48 kYes, 49 }; 50 51 BmhParser(bool skip) : ParserCommon() 52 , fMaps { 53 { &fClassMap, MarkType::kClass } 54 , { &fConstMap, MarkType::kConst } 55 , { &fDefineMap, MarkType::kDefine } 56 , { &fEnumMap, MarkType::kEnum } 57 , { &fClassMap, MarkType::kEnumClass } 58 , { &fMethodMap, MarkType::kMethod } 59 , { &fClassMap, MarkType::kStruct } 60 , { &fClassMap, MarkType::kTemplate } 61 , { &fTypedefMap, MarkType::kTypedef } 62 } 63 , fSkip(skip) { 64 this->reset(); 65 } 66 67 ~BmhParser() override {} 68 69 bool addDefinition(const char* defStart, bool hasEnd, MarkType markType, 70 const vector<string>& typeNameBuilder, HasTag hasTag); 71 bool checkEndMarker(MarkType markType, string name) const; 72 bool checkExamples() const; 73 const char* checkForFullTerminal(const char* end, const Definition* ) const; 74 bool checkParamReturn(const Definition* definition) const; 75 bool dumpExamples(FILE* fiddleOut, Definition& def, bool* continuation) const; 76 bool dumpExamples(const char* fiddleJsonFileName) const; 77 bool checkExampleHashes() const; 78 bool childOf(MarkType markType) const; 79 string className(MarkType markType); 80 bool collectExternals(); 81 int endHashCount() const; 82 bool endTableColumn(const char* end, const char* terminator); 83 bool exampleToScript(Definition*, ExampleOptions, string* result ) const; 84 string extractText(const Definition* , TrimExtract ) const; 85 RootDefinition* findBmhObject(MarkType markType, string typeName); 86 bool findDefinitions(); 87 Definition* findExample(string name) const; 88 MarkType getMarkType(MarkLookup lookup) const; 89 bool hasEndToken() const; 90 static bool IsExemplary(const Definition* ); 91 string loweredTopic(string name, Definition* def); 92 string memberName(); 93 string methodName(); 94 const Definition* parentSpace() const; 95 96 bool parseFromFile(const char* path) override { 97 if (!INHERITED::parseSetup(path)) { 98 return false; 99 } 100 fCheckMethods = !strstr(path, "undocumented.bmh"); 101 return findDefinitions(); 102 } 103 104 void parseHashAnchor(Definition* ); 105 void parseHashFormula(Definition* ); 106 void parseHashLine(Definition* ); 107 bool popParentStack(Definition* ); 108 void reportDuplicates(const Definition& , string dup) const; 109 void resetExampleHashes(); 110 111 void reset() override { 112 INHERITED::resetCommon(); 113 fRoot = nullptr; 114 fWorkingColumn = nullptr; 115 fRow = nullptr; 116 fTableState = TableState::kNone; 117 fMC = '#'; 118 fInChar = false; 119 fInCharCommentString = false; 120 fInComment = false; 121 fInEnum = false; 122 fInString = false; 123 fCheckMethods = false; 124 } 125 126 void setUpGlobalSubstitutes(); 127 void setUpPartialSubstitute(string name); 128 void setUpSubstitute(string name, Definition* def); 129 void setUpSubstitutes(const Definition* parent, NameMap* ); 130 void setWrapper(Definition* def) const; 131 bool skipNoName(); 132 bool skipToDefinitionEnd(MarkType markType); 133 bool skipToString(); 134 void spellCheck(const char* match, SkCommandLineFlags::StringArray report) const; 135 void spellStatus(const char* match, SkCommandLineFlags::StringArray report) const; 136 vector<string> topicName(); 137 vector<string> typeName(MarkType markType, bool* expectEnd); 138 string typedefName() override; 139 string uniqueName(string base, MarkType markType); 140 string uniqueRootName(string base, MarkType markType); 141 void validate() const; 142 string word(string prefix, string delimiter); 143 144 public: 145 struct MarkProps { 146 const char* fName; 147 MarkType fMarkType; 148 Resolvable fResolve; 149 Exemplary fExemplary; // worthy of an example 150 uint64_t fParentMask; 151 }; 152 153 struct DefinitionMap { 154 unordered_map<string, RootDefinition>* fMap; 155 MarkType fMarkType; 156 }; 157 158 vector<DefinitionMap> fMaps; 159 160 static MarkProps kMarkProps[Last_MarkType + 1]; 161 forward_list<RootDefinition> fTopics; 162 forward_list<Definition> fMarkup; 163 forward_list<RootDefinition> fExternals; 164 vector<string> fInputFiles; 165 unordered_map<string, RootDefinition> fClassMap; 166 unordered_map<string, RootDefinition> fConstMap; 167 unordered_map<string, RootDefinition> fDefineMap; 168 unordered_map<string, RootDefinition> fEnumMap; 169 unordered_map<string, RootDefinition> fMethodMap; 170 unordered_map<string, RootDefinition> fTypedefMap; 171 unordered_map<string, Definition*> fTopicMap; 172 unordered_map<string, Definition*> fAliasMap; 173 unordered_map<string, Definition*> fPhraseMap; 174 NameMap fGlobalNames; 175 RootDefinition* fRoot; 176 Definition* fWorkingColumn; 177 Definition* fRow; 178 const char* fColStart; 179 TableState fTableState; 180 mutable char fMC; // markup character 181 bool fAnonymous; 182 bool fCloned; 183 bool fInChar; 184 bool fInCharCommentString; 185 bool fInEnum; 186 bool fInComment; 187 bool fInString; 188 bool fCheckMethods; 189 bool fSkip = false; 190 bool fWroteOut = false; 191 private: 192 typedef ParserCommon INHERITED; 193 }; 194 195 #endif 196