/usr/include/belr/grammarbuilder.hh is in libbelr-dev 0.1.3-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | #ifndef grammarbuilder_hh
#define grammarbuilder_hh
#include "parser.hh"
#include <vector>
namespace belr{
class ABNFAlternation;
class ABNFBuilder{
public:
virtual ~ABNFBuilder();
virtual std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar)=0;
};
class ABNFRule : public ABNFBuilder{
public:
ABNFRule();
static std::shared_ptr<ABNFRule> create();
void setName(const std::string &name);
void setDefinedAs(const std::string &defined_as);
void setAlternation(const std::shared_ptr<ABNFAlternation> &a);
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
bool isExtension()const;
const std::string &getName()const{
return mName;
}
private:
std::shared_ptr<ABNFAlternation> mAlternation;
std::string mName;
std::string mDefinedAs;
};
class ABNFRuleList : public ABNFBuilder{
public:
static std::shared_ptr<ABNFRuleList> create();
void addRule(const std::shared_ptr<ABNFRule> & rule);
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
private:
std::list<std::shared_ptr<ABNFRule>> mRules;
};
class ABNFNumval : public ABNFBuilder{
public:
ABNFNumval();
static std::shared_ptr<ABNFNumval> create();
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
void setDecVal(const std::string &decval);
void setHexVal(const std::string &hexval);
void setBinVal(const std::string &binval);
private:
void parseValues(const std::string &val, int base);
std::vector<int> mValues;
bool mIsRange;
};
class ABNFElement : public ABNFBuilder{
public:
ABNFElement();
static std::shared_ptr<ABNFElement> create();
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
void setElement(const std::shared_ptr<ABNFBuilder> &e);
void setRulename(const std::string &rulename);
void setCharVal(const std::string &charval);
void setProseVal(const std::string &prose);
private:
std::shared_ptr<ABNFBuilder> mElement;
std::string mRulename;
std::string mCharVal;
};
class ABNFGroup : public ABNFBuilder{
public:
ABNFGroup();
static std::shared_ptr<ABNFGroup> create();
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
void setAlternation(const std::shared_ptr<ABNFAlternation> &a);
private:
std::shared_ptr<ABNFAlternation> mAlternation;
};
class ABNFRepetition : public ABNFBuilder{
public:
ABNFRepetition();
static std::shared_ptr<ABNFRepetition> create();
void setRepeat(const std::string &r);
void setMin(int min);
void setMax(int max);
void setCount(int count);
void setElement(const std::shared_ptr<ABNFElement> &e);
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
private:
int mMin, mMax, mCount;
std::string mRepeat;
std::shared_ptr<ABNFElement> mElement;
};
class ABNFOption : public ABNFBuilder{
public:
ABNFOption();
static std::shared_ptr<ABNFOption> create();
void setAlternation(const std::shared_ptr<ABNFAlternation> &a);
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
private:
std::shared_ptr<ABNFAlternation> mAlternation;
};
class ABNFConcatenation : public ABNFBuilder{
public:
static std::shared_ptr<ABNFConcatenation> create();
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
void addRepetition(const std::shared_ptr<ABNFRepetition> &r);
private:
std::list<std::shared_ptr<ABNFRepetition>> mRepetitions;
};
class ABNFAlternation : public ABNFBuilder{
public:
static std::shared_ptr<ABNFAlternation> create();
void addConcatenation(const std::shared_ptr<ABNFConcatenation> &c);
std::shared_ptr<Recognizer> buildRecognizer(const std::shared_ptr<Grammar> &grammar);
std::shared_ptr<Recognizer> buildRecognizerNoOptim(const std::shared_ptr<Grammar> &grammar);
private:
std::list<std::shared_ptr<ABNFConcatenation>> mConcatenations;
};
/**
* The ABNFGrammarBuilder builds a Grammar object from an ABNF grammar defined in a text file.
**/
class ABNFGrammarBuilder{
public:
/**
* Initialize the builder.
**/
BELR_PUBLIC ABNFGrammarBuilder();
/**
* Create a grammar from an ABNF grammar defined in the string pointed by abnf.
* An optional Grammar argument corresponding to a grammar to include can be passed.
* Usually the belr::CoreRules grammar is required for most IETF text protocols.
* The returned grammar can be used to instanciate a belr::Parser object capable of parsing
* the protocol or language described in the grammar.
* @param abnf the string that contains the abnf grammar.
* @param grammar an optional grammar to include.
* @return the Grammar object corresponding to the text definition loaded, NULL if an error occured.
**/
BELR_PUBLIC std::shared_ptr<Grammar> createFromAbnf(const std::string &abnf, const std::shared_ptr<Grammar> &grammar=NULL);
/**
* Create a grammar from an ABNF grammar defined in the text file pointed by path.
* An optional Grammar argument corresponding to a grammar to include can be passed.
* Usually the belr::CoreRules grammar is required for most IETF text protocols.
* The returned grammar can be used to instanciate a belr::Parser object capable of parsing
* the protocol or language described in the grammar.
* @param path the path from where to load the abnf definition.
* @param grammar an optional grammar to include.
* @return the Grammar object corresponding to the text definition loaded, NULL if an error occured.
**/
BELR_PUBLIC std::shared_ptr<Grammar> createFromAbnfFile(const std::string &path, const std::shared_ptr<Grammar> &grammar=NULL);
private:
Parser<std::shared_ptr<ABNFBuilder>> mParser;
};
}
#endif
|