diff options
Diffstat (limited to 'tools/bookmaker/bmhParser.h')
-rw-r--r-- | tools/bookmaker/bmhParser.h | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/tools/bookmaker/bmhParser.h b/tools/bookmaker/bmhParser.h new file mode 100644 index 0000000000..2eb0053477 --- /dev/null +++ b/tools/bookmaker/bmhParser.h @@ -0,0 +1,194 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef bmhParser_DEFINED +#define bmhParser_DEFINED + +#include "SkCommandLineFlags.h" + +#include "definition.h" +#include "parserCommon.h" + +class BmhParser : public ParserCommon { +public: + enum class MarkLookup { + kRequire, + kAllowUnknown, + }; + + enum class ExampleOptions { + kText, + kPng, + kAll + }; + + enum class Exemplary { + kNo, + kYes, + kOptional, + }; + + enum class TableState { + kNone, + kColumnStart, + kColumnEnd, + }; + + enum class HasTag { + kNo, + kYes, + }; + + enum class TrimExtract { + kNo, + kYes, + }; + + BmhParser(bool skip) : ParserCommon() + , fMaps { + { &fClassMap, MarkType::kClass } + , { &fConstMap, MarkType::kConst } + , { &fDefineMap, MarkType::kDefine } + , { &fEnumMap, MarkType::kEnum } + , { &fClassMap, MarkType::kEnumClass } + , { &fMethodMap, MarkType::kMethod } + , { &fClassMap, MarkType::kStruct } + , { &fTypedefMap, MarkType::kTypedef } + } + , fSkip(skip) { + this->reset(); + } + + ~BmhParser() override {} + + bool addDefinition(const char* defStart, bool hasEnd, MarkType markType, + const vector<string>& typeNameBuilder, HasTag hasTag); + bool checkEndMarker(MarkType markType, string name) const; + bool checkExamples() const; + const char* checkForFullTerminal(const char* end, const Definition* ) const; + bool checkParamReturn(const Definition* definition) const; + bool dumpExamples(FILE* fiddleOut, Definition& def, bool* continuation) const; + bool dumpExamples(const char* fiddleJsonFileName) const; + bool checkExampleHashes() const; + bool childOf(MarkType markType) const; + string className(MarkType markType); + bool collectExternals(); + int endHashCount() const; + bool endTableColumn(const char* end, const char* terminator); + bool exampleToScript(Definition*, ExampleOptions, string* result ) const; + string extractText(const Definition* , TrimExtract ) const; + RootDefinition* findBmhObject(MarkType markType, string typeName); + bool findDefinitions(); + Definition* findExample(string name) const; + MarkType getMarkType(MarkLookup lookup) const; + bool hasEndToken() const; + static bool IsExemplary(const Definition* ); + string loweredTopic(string name, Definition* def); + string memberName(); + string methodName(); + const Definition* parentSpace() const; + + bool parseFromFile(const char* path) override { + if (!INHERITED::parseSetup(path)) { + return false; + } + fCheckMethods = !strstr(path, "undocumented.bmh"); + return findDefinitions(); + } + + void parseHashAnchor(Definition* ); + void parseHashFormula(Definition* ); + void parseHashLine(Definition* ); + bool popParentStack(Definition* ); + void reportDuplicates(const Definition& , string dup) const; + void resetExampleHashes(); + + void reset() override { + INHERITED::resetCommon(); + fRoot = nullptr; + fWorkingColumn = nullptr; + fRow = nullptr; + fTableState = TableState::kNone; + fMC = '#'; + fInChar = false; + fInCharCommentString = false; + fInComment = false; + fInEnum = false; + fInString = false; + fCheckMethods = false; + } + + void setUpGlobalSubstitutes(); + void setUpPartialSubstitute(string name); + void setUpSubstitute(string name, Definition* def); + void setUpSubstitutes(const Definition* parent, NameMap* ); + void setWrapper(Definition* def) const; + bool skipNoName(); + bool skipToDefinitionEnd(MarkType markType); + bool skipToString(); + void spellCheck(const char* match, SkCommandLineFlags::StringArray report) const; + void spellStatus(const char* match, SkCommandLineFlags::StringArray report) const; + vector<string> topicName(); + vector<string> typeName(MarkType markType, bool* expectEnd); + string typedefName() override; + string uniqueName(string base, MarkType markType); + string uniqueRootName(string base, MarkType markType); + void validate() const; + string word(string prefix, string delimiter); + +public: + struct MarkProps { + const char* fName; + MarkType fMarkType; + Resolvable fResolve; + Exemplary fExemplary; // worthy of an example + uint64_t fParentMask; + }; + + struct DefinitionMap { + unordered_map<string, RootDefinition>* fMap; + MarkType fMarkType; + }; + + vector<DefinitionMap> fMaps; + + static MarkProps kMarkProps[Last_MarkType + 1]; + forward_list<RootDefinition> fTopics; + forward_list<Definition> fMarkup; + forward_list<RootDefinition> fExternals; + vector<string> fInputFiles; + unordered_map<string, RootDefinition> fClassMap; + unordered_map<string, RootDefinition> fConstMap; + unordered_map<string, RootDefinition> fDefineMap; + unordered_map<string, RootDefinition> fEnumMap; + unordered_map<string, RootDefinition> fMethodMap; + unordered_map<string, RootDefinition> fTypedefMap; + unordered_map<string, Definition*> fTopicMap; + unordered_map<string, Definition*> fAliasMap; + unordered_map<string, Definition*> fPhraseMap; + NameMap fGlobalNames; + RootDefinition* fRoot; + Definition* fWorkingColumn; + Definition* fRow; + const char* fColStart; + TableState fTableState; + mutable char fMC; // markup character + bool fAnonymous; + bool fCloned; + bool fInChar; + bool fInCharCommentString; + bool fInEnum; + bool fInComment; + bool fInString; + bool fCheckMethods; + bool fSkip = false; + bool fWroteOut = false; +private: + typedef ParserCommon INHERITED; +}; + +#endif |