5 #ifndef HOBBES_PARSE_LALR_HPP_INCLUDED 6 #define HOBBES_PARSE_LALR_HPP_INCLUDED 18 typedef std::vector<rule>
rules;
19 typedef std::map<terminal*, rules>
grammar;
125 itemset
closure(
const grammar& g,
const itemset&
is);
126 void closure(
const grammar& g, itemset*
is);
154 bool reads(
const parserdef&
p,
const transition& x,
const transition& y);
160 template <
typename X,
typename Y,
typename Fp,
typename A,
typename R>
163 typedef std::set<X>
Xs;
164 typedef std::map<X, Y>
F;
166 static F
map(
const Xs& xs,
const Fp& fp,
const A&
append,
const R&
r) {
175 digraphF(
const Xs& xs,
const Fp& fp,
const A& append,
const R& r) : xs(xs), fp(fp), append(append), r(r) {
184 Xidxs n = freshIdxs(this->xs);
186 for (
typename Xs::const_iterator x = this->xs.begin(); x != this->xs.end(); ++x) {
188 traverse(*x, &s, &n, &f);
195 void traverse(X x, Xstack* s, Xidxs* n, F* f)
const {
201 (*f)[x] = this->fp(x);
204 for (
typename Xs::const_iterator y = this->xs.begin(); y != this->xs.end(); ++y) {
205 if (this->
r(x, *y)) {
209 traverse(*y, s, n, f);
213 (*f)[x] = this->
append((*f)[x], (*f)[*y]);
234 for (
typename Xs::const_iterator x = xs.begin(); x != xs.end(); ++x) {
246 transition_lookahead
Reads(
const parserdef&
p,
const transitionset& ts);
267 const grammar& failedGrammar()
const;
268 const itemset& failedItems()
const;
271 void print(std::ostream&)
const;
277 void print(std::ostream&,
const item&)
const;
297 nat goToState()
const;
299 bool isShift()
const;
300 nat shiftState()
const;
302 bool isReduce()
const;
304 nat reduceRule()
const;
305 nat reduceSize()
const;
307 bool isAccept()
const;
311 bool operator!=(
const action& rhs)
const;
313 std::ostream& fmt(std::ostream&
out)
const;
344 void show(std::ostream&,
const lrtable&);
nat n
Definition: lalr.H:324
item(terminal *agg, nat p, nat r, const terminalset &la=terminalset())
Definition: lalr.C:210
bool reads(const parserdef &p, const transition &x, const transition &y)
Definition: lalr.C:513
transitionset transitions(const parserdef &p)
Definition: lalr.C:407
void traverse(X x, Xstack *s, Xidxs *n, F *f) const
Definition: lalr.H:195
terminal * x
Definition: lalr.H:322
std::vector< itemset > itemsets
Definition: lalr.H:38
void undefineSymbol(terminal *s, grammar *g)
Definition: lalr.C:29
nat parserState(const itemset &s, parserdef *p)
Definition: lalr.C:348
terminalset nullable
Definition: lalr.H:62
const T * is(const S *s)
Definition: ptr.H:107
bool operator<(const item &rhs) const
Definition: lalr.C:212
terminal * agg
Definition: lalr.H:25
std::vector< terminal * > terminals
Definition: terminal.H:28
std::vector< rule > rules
Definition: lalr.H:18
std::vector< lrstate > lrtable
Definition: lalr.H:337
void print(std::ostream &out, const NFA &nfa)
Definition: regex.C:525
parserdef lalr1parser(const grammar &g, terminal *s)
Definition: lalr.C:580
void removeRuleRefs(terminal *s, grammar *g)
Definition: lalr.C:17
unsigned int nat
Definition: data.H:20
Definition: terminal.H:19
static Xidxs freshIdxs(const Xs &xs)
Definition: lalr.H:232
std::map< X, nat > Xidxs
Definition: lalr.H:179
bool directlyDerivesNull(const rule &r)
Definition: lalr.C:143
static nat inf()
Definition: lalr.H:240
std::map< X, Y > F
Definition: lalr.H:164
parser_state_transitions transitions
Definition: lalr.H:61
transition_lookahead Follow(const parserdef &p, const transitionset &ts)
Definition: lalr.C:558
itemset follow(const grammar &g, const itemset &is, terminal *v)
Definition: lalr.C:309
terminal * t
Definition: lalr.H:259
const Fp & fp
Definition: lalr.H:171
terminalset definedSymbols(const grammar &g)
Definition: lalr.C:52
std::set< X > Xs
Definition: lalr.H:163
static F map(const Xs &xs, const Fp &fp, const A &append, const R &r)
Definition: lalr.H:166
void append(std::vector< T > *xs, const std::vector< T > &ys)
Definition: array.H:292
lrtable lalrTable(const parserdef &pd, const precedence &p=precedence())
Definition: lalr.C:671
bool lookback(const parserdef &p, nat q, terminal *r, const rule &w, const transition &t)
Definition: lalr.C:462
std::ostream & operator<<(std::ostream &out, const array< char > *x)
Definition: hobbes.H:38
std::set< item > itemset
Definition: lalr.H:37
itemset closure(const grammar &g, const itemset &is)
Definition: lalr.C:342
void removeRuleDefs(terminal *s, grammar *g)
Definition: lalr.C:10
item succ(const item &i)
Definition: lalr.C:279
nat r
Definition: lalr.H:323
terminalset symbolsDerivingNull(const grammar &g)
Definition: lalr.C:189
terminalset topLevelSymbols(const grammar &g)
Definition: lalr.C:57
std::stack< X > Xstack
Definition: lalr.H:178
grammar g
Definition: lalr.H:273
transition_lookahead Reads(const parserdef &p, const transitionset &ts)
Definition: lalr.C:553
const R & r
Definition: lalr.H:173
uint8_t act
Definition: lalr.H:315
digraphF(const Xs &xs, const Fp &fp, const A &append, const R &r)
Definition: lalr.H:175
std::string show(const Expr &e)
Definition: expr.C:19
std::map< transition, terminalset > transition_lookahead
Definition: lalr.H:244
parser_states states
Definition: lalr.H:59
std::map< itemset, nat > parser_states
Definition: lalr.H:44
std::map< nat, itemset > state_definitions
Definition: lalr.H:47
bool derivesNull(const terminalset &nullAggs, const rule &r)
Definition: lalr.C:157
itemset faileditems
Definition: lalr.H:274
const Xs & xs
Definition: lalr.H:170
grammar g
Definition: lalr.H:57
nat r
Definition: lalr.H:27
terminal * next(const grammar &g, const item &i)
Definition: lalr.C:283
void w(const T &x, bytes *out)
Definition: net.H:282
terminalset la
Definition: lalr.H:29
std::set< transition > transitionset
Definition: lalr.H:142
terminalset directReads(const parserdef &p, const transition &x)
Definition: lalr.C:518
std::map< nat, state_transitions > parser_state_transitions
Definition: lalr.H:53
std::map< terminal *, rules > grammar
Definition: lalr.H:19
size_t rs(const reader::MetaData &md, size_t o, size_t n, uint8_t *b)
Definition: storage.H:1720
#define out
Definition: netio.H:19
std::map< terminal *, nat > state_transitions
Definition: lalr.H:41
const A & append
Definition: lalr.H:172
std::map< terminal *, prec > precedence
Definition: terminal.H:82
state_definitions state_defs
Definition: lalr.H:60
parserdef lr0parser(const grammar &g, terminal *s)
Definition: lalr.C:379
terminalset nextPrim(const grammar &g, const itemset &is)
Definition: lalr.C:297
terminalset symbolsUsing(const grammar &g, terminal *s)
Definition: lalr.C:101
void symbolsUsed(const grammar &g, const rule &r, terminalset *ss)
Definition: lalr.C:71
bool operator==(const item &rhs) const
Definition: lalr.C:222
F map() const
Definition: lalr.H:181
nat p
Definition: lalr.H:26
terminal * t
Definition: lalr.H:275
std::pair< nat, terminal * > transition
Definition: lalr.H:141
std::map< terminal *, action > lrstate
Definition: lalr.H:334
bool hasRule(const grammar &g, terminal *t)
Definition: lalr.C:114
terminal * s
Definition: lalr.H:58
bool includes(const parserdef &p, const transition &x, const transition &y)
Definition: lalr.C:499
std::set< terminal * > terminalset
Definition: terminal.H:29
nat s
Definition: lalr.H:318
terminals rule
Definition: lalr.H:17