You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.8 KiB
196 lines
5.8 KiB
/*
|
|
* 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 }
|
|
, { &fClassMap, MarkType::kTemplate }
|
|
, { &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
|