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 166 167 168 169 170 171 172 173 174 175 176 177 178
|
// hdr/includes
#ifndef ParserBase_h_included
#define ParserBase_h_included
#include <exception>
#include <vector>
#include <iostream>
// $insert preincludes
#include "../tokens/tokens.h"
// hdr/baseclass
namespace // anonymous
{
struct PI_;
}
// $insert parserbase
class ParserBase: public Tokens
{
public:
enum DebugMode_
{
OFF = 0,
ON = 1 << 0,
ACTIONCASES = 1 << 1
};
// $insert tokens
// $insert STYPE
using STYPE_ = int;
private:
// state semval
using StatePair = std::pair<size_t, STYPE_>;
// token semval
using TokenPair = std::pair<int, STYPE_>;
int d_stackIdx = -1;
std::vector<StatePair> d_stateStack;
StatePair *d_vsp = 0; // points to the topmost value stack
size_t d_state = 0;
TokenPair d_next;
int d_token;
bool d_terminalToken = false;
bool d_recovery = false;
protected:
enum Return_
{
PARSE_ACCEPT_ = 0, // values used as parse()'s return values
PARSE_ABORT_ = 1
};
enum ErrorRecovery_
{
UNEXPECTED_TOKEN_,
};
bool d_actionCases_ = false; // set by options/directives
bool d_debug_ = true;
size_t d_requiredTokens_;
size_t d_nErrors_; // initialized by clearin()
size_t d_acceptedTokens_;
STYPE_ d_val_;
ParserBase();
void ABORT() const;
void ACCEPT() const;
void ERROR() const;
STYPE_ &vs_(int idx); // value stack element idx
int lookup_() const;
int savedToken_() const;
int token_() const;
size_t stackSize_() const;
size_t state_() const;
size_t top_() const;
void clearin_();
void errorVerbose_();
void lex_(int token);
void popToken_();
void pop_(size_t count = 1);
void pushToken_(int token);
void push_(size_t nextState);
void redoToken_();
bool recovery_() const;
void reduce_(int rule);
void shift_(int state);
void startRecovery_();
public:
void setDebug(bool mode);
void setDebug(DebugMode_ mode);
};
// hdr/abort
inline void ParserBase::ABORT() const
{
throw PARSE_ABORT_;
}
// hdr/accept
inline void ParserBase::ACCEPT() const
{
throw PARSE_ACCEPT_;
}
// hdr/error
inline void ParserBase::ERROR() const
{
throw UNEXPECTED_TOKEN_;
}
// hdr/savedtoken
inline int ParserBase::savedToken_() const
{
return d_next.first;
}
// hdr/opbitand
inline ParserBase::DebugMode_ operator&(ParserBase::DebugMode_ lhs,
ParserBase::DebugMode_ rhs)
{
return static_cast<ParserBase::DebugMode_>(
static_cast<int>(lhs) & rhs);
}
// hdr/opbitor
inline ParserBase::DebugMode_ operator|(ParserBase::DebugMode_ lhs,
ParserBase::DebugMode_ rhs)
{
return static_cast<ParserBase::DebugMode_>(static_cast<int>(lhs) | rhs);
};
// hdr/recovery
inline bool ParserBase::recovery_() const
{
return d_recovery;
}
// hdr/stacksize
inline size_t ParserBase::stackSize_() const
{
return d_stackIdx + 1;
}
// hdr/state
inline size_t ParserBase::state_() const
{
return d_state;
}
// hdr/token
inline int ParserBase::token_() const
{
return d_token;
}
// hdr/vs
inline ParserBase::STYPE_ &ParserBase::vs_(int idx)
{
return (d_vsp + idx)->second;
}
#endif
|