Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
lalr.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#ifndef LALR_H
5#define LALR_H
6
7#include <QtCore/qset.h>
8#include <QtCore/qstack.h>
9#include <QtCore/qmap.h>
10#include <QtCore/qstring.h>
11#include <QtCore/qtextstream.h>
12#include <QtCore/qpair.h>
13
14#include <algorithm>
15#include <functional>
16#include <set>
17#include <list>
18
19class Rule;
20class State;
21class Grammar;
22class Item;
23class State;
24class Arrow;
25class Automaton;
26
27
28// names
29typedef std::list<QString>::iterator Name;
30typedef std::list<Name> NameList;
31typedef std::set<Name> NameSet;
32
33// items
34typedef std::list<Item> ItemList;
35typedef ItemList::iterator ItemPointer;
36
37// rules
38typedef std::list<Rule> debug_infot;
39typedef debug_infot::iterator RulePointer;
41
42// states
43typedef std::list<State> StateList;
44typedef StateList::iterator StatePointer;
45
46// arrows
48
49class Rule
50{
51public:
52 void clear ()
53 {
54 lhs = Name ();
55 rhs.clear ();
56 prec = Name ();
57 }
58
59public:
63};
64
66{
67public:
69 state (s), nt (n) {}
70
71 inline bool operator == (const Lookback &other) const
72 { return state == other.state && nt == other.nt; }
73
74 inline bool operator != (const Lookback &other) const
75 { return state != other.state || nt != other.nt; }
76
77 bool operator < (const Lookback &other) const;
78
79public:
82};
83
84class Item
85{
86public:
87 inline NameList::iterator begin_rhs () const
88 { return rule->rhs.begin (); }
89
90 inline NameList::iterator end_rhs () const
91 { return rule->rhs.end (); }
92
93 inline bool operator == (const Item &other) const
94 { return rule == other.rule && dot == other.dot; }
95
96 inline bool operator != (const Item &other) const
97 { return rule != other.rule || dot != other.dot; }
98
99 inline bool isReduceItem () const
100 { return dot == rule->rhs.end (); }
101
102 Item next () const;
103
104public:
106 NameList::iterator dot;
107};
108
109class State
110{
111public:
113
114 inline bool operator == (const State &other) const
115 { return kernel == other.kernel; }
116
117 inline bool operator != (const State &other) const
118 { return kernel != other.kernel; }
119
122
123public: // attributes
130};
131
133// digraph
135template <typename _Tp>
136class Node
137{
138public:
139 typedef std::set<Node<_Tp> > Repository;
140 typedef typename Repository::iterator iterator;
141 typedef typename std::list<iterator>::iterator edge_iterator;
142
143public:
144 static iterator get (_Tp data);
145
147
148 inline edge_iterator begin () const
149 { return outs.begin (); }
150
151 inline edge_iterator end () const
152 { return outs.end (); }
153
154 inline bool operator == (const Node<_Tp> &other) const
155 { return data == other.data; }
156
157 inline bool operator != (const Node<_Tp> &other) const
158 { return data != other.data; }
159
160 inline bool operator < (const Node<_Tp> &other) const
161 { return data < other.data; }
162
163 static inline iterator begin_nodes ()
164 { return repository ().begin (); }
165
166 static inline iterator end_nodes ()
167 { return repository ().end (); }
168
170 {
171 static Repository r;
172 return r;
173 }
174
175public: // attributes
176 mutable bool root;
177 mutable int dfn;
178 mutable _Tp data;
179 mutable std::list<iterator> outs;
180
181protected:
182 inline Node () {}
183
184 inline Node (_Tp d):
185 root (true), dfn (0), data (d) {}
186};
187
188template <typename _Tp>
190{
191 Node<_Tp> tmp (data);
192 iterator it = repository ().find (tmp);
193
194 if (it != repository ().end ())
195 return it;
196
197 return repository ().insert (tmp).first;
198}
199
200template <typename _Tp>
202{
203 edge_iterator it = std::find (outs.begin (), outs.end (), other);
204
205 if (it != outs.end ())
206 return qMakePair (it, false);
207
208 other->root = false;
209 return qMakePair (outs.insert (outs.end (), other), true);
210}
211
213// Grammar
216{
217public:
218 Grammar ();
219
220 Name intern (const QString &id);
221 Name intern (const char *id) { return intern(QString::fromUtf8(id)); }
222
223 inline bool isTerminal (Name name) const
224 { return terminals.find (name) != terminals.end (); }
225
226 inline bool isNonTerminal (Name name) const
227 { return non_terminals.find (name) != non_terminals.end (); }
228
229 void buildRuleMap ();
230 void buildExtendedGrammar ();
231
232public:
238 std::list<QString> names;
251
252 enum Assoc {
255 Right
256 };
257
258 struct TokenInfo {
260 int prec;
261 };
262
266};
267
268class Read
269{
270public:
271 inline Read () {}
272
274 state (s), nt (n) {}
275
276 inline bool operator == (const Read &other) const
277 { return state == other.state && nt == other.nt; }
278
279 inline bool operator != (const Read &other) const
280 { return state != other.state || nt != other.nt; }
281
282 bool operator < (const Read &other) const;
283
284public:
287};
288
290{
291public:
292 inline Include () {}
293
295 state (s), nt (n) {}
296
297 inline bool operator == (const Include &other) const
298 { return state == other.state && nt == other.nt; }
299
300 inline bool operator != (const Include &other) const
301 { return state != other.state || nt != other.nt; }
302
303 bool operator < (const Include &other) const;
304
305public:
308};
309
311{
312public:
314
316
319
322
323 void build ();
324 void buildNullables ();
325
326 void buildLookbackSets ();
327
328 void buildDirectReads ();
329 void buildReadsDigraph ();
330 void buildReads ();
331 void visitReadNode (ReadNode node);
332
334 void buildIncludesDigraph ();
335 void visitIncludeNode (IncludeNode node);
336
337 void buildLookaheads ();
338
340
342
343 int id (RulePointer rule);
344 int id (StatePointer state);
345 int id (Name name);
346
347 void dump (QTextStream &out, IncludeNode incl);
349 void dump (QTextStream &out, const Lookback &lp);
350
351public: // ### private
358
359private:
360 QStack<ReadsGraph::iterator> _M_reads_stack;
361 int _M_reads_dfn;
362
363 QStack<IncludesGraph::iterator> _M_includes_stack;
364 int _M_includes_dfn;
365};
366
367namespace std {
368bool operator < (Name a, Name b);
371}
372
377
382
383#endif // LALR_H
void buildReadsDigraph()
Definition lalr.cpp:474
ReadsGraph::iterator ReadNode
Definition lalr.h:318
void buildDefaultReduceActions()
Definition lalr.cpp:724
void dump(QTextStream &out, ReadNode rd)
void buildNullables()
Definition lalr.cpp:277
StatePointer start
Definition lalr.h:354
void build()
Definition lalr.cpp:257
void visitReadNode(ReadNode node)
Definition lalr.cpp:528
void buildReads()
Definition lalr.cpp:509
void dump(QTextStream &out, IncludeNode incl)
Definition lalr.cpp:752
void buildIncludesDigraph()
Definition lalr.cpp:586
IncludesGraph::iterator IncludeNode
Definition lalr.h:321
NameSet nullables
Definition lalr.h:355
void buildIncludesAndFollows()
Definition lalr.cpp:565
Grammar * _M_grammar
Definition lalr.h:352
void buildLookaheads()
Definition lalr.cpp:693
void buildDirectReads()
Definition lalr.cpp:445
StateList states
Definition lalr.h:353
Node< Read > ReadsGraph
Definition lalr.h:317
QPair< StatePointer, bool > internState(const State &state)
Definition lalr.cpp:299
void buildLookbackSets()
Definition lalr.cpp:391
void visitIncludeNode(IncludeNode node)
Definition lalr.cpp:647
Node< Include > IncludesGraph
Definition lalr.h:320
QMultiMap< ItemPointer, Lookback > lookbacks
Definition lalr.h:356
void closure(StatePointer state)
Definition lalr.cpp:327
QMap< ItemPointer, NameSet > lookaheads
Definition lalr.h:357
QMap< Name, QString > spells
Definition lalr.h:242
Assoc
Definition lalr.h:252
@ Left
Definition lalr.h:254
@ Right
Definition lalr.h:255
@ NonAssoc
Definition lalr.h:253
Name intern(const char *id)
Definition lalr.h:221
int expected_reduce_reduce
Definition lalr.h:250
Name accept_symbol
Definition lalr.h:247
QString merged_output
Definition lalr.h:233
Name tk_end
Definition lalr.h:246
QString impl_file_name
Definition lalr.h:236
Assoc current_assoc
Definition lalr.h:264
QMap< Name, TokenInfo > token_info
Definition lalr.h:263
NameSet terminals
Definition lalr.h:240
NameSet declared_lhs
Definition lalr.h:248
debug_infot rules
Definition lalr.h:243
Name start
Definition lalr.h:239
int current_prec
Definition lalr.h:265
bool isNonTerminal(Name name) const
Definition lalr.h:226
QString token_prefix
Definition lalr.h:237
std::list< QString > names
Definition lalr.h:238
bool isTerminal(Name name) const
Definition lalr.h:223
QString table_name
Definition lalr.h:234
void buildRuleMap()
Definition lalr.cpp:193
Grammar()
Definition lalr.cpp:166
RulePointer goal
Definition lalr.h:245
RuleMap rule_map
Definition lalr.h:244
QString decl_file_name
Definition lalr.h:235
void buildExtendedGrammar()
Definition lalr.cpp:213
Name intern(const QString &id)
Definition lalr.cpp:183
NameSet non_terminals
Definition lalr.h:241
int expected_shift_reduce
Definition lalr.h:249
bool operator<(const Include &other) const
Definition lalr.cpp:58
Include(StatePointer s, Name n)
Definition lalr.h:294
Name nt
Definition lalr.h:307
Include()
Definition lalr.h:292
StatePointer state
Definition lalr.h:306
bool operator==(const Include &other) const
Definition lalr.h:297
bool operator!=(const Include &other) const
Definition lalr.h:300
Definition lalr.h:85
bool isReduceItem() const
Definition lalr.h:99
Item next() const
Definition lalr.cpp:104
NameList::iterator dot
Definition lalr.h:106
bool operator!=(const Item &other) const
Definition lalr.h:96
NameList::iterator end_rhs() const
Definition lalr.h:90
bool operator==(const Item &other) const
Definition lalr.h:93
NameList::iterator begin_rhs() const
Definition lalr.h:87
RulePointer rule
Definition lalr.h:105
StatePointer state
Definition lalr.h:80
Lookback(StatePointer s, Name n)
Definition lalr.h:68
bool operator<(const Lookback &other) const
Definition lalr.cpp:66
bool operator!=(const Lookback &other) const
Definition lalr.h:74
Name nt
Definition lalr.h:81
bool operator==(const Lookback &other) const
Definition lalr.h:71
Definition lalr.h:137
bool operator<(const Node< _Tp > &other) const
Definition lalr.h:160
static Repository & repository()
Definition lalr.h:169
edge_iterator end() const
Definition lalr.h:151
static iterator get(_Tp data)
Definition lalr.h:189
bool root
Definition lalr.h:176
static iterator begin_nodes()
Definition lalr.h:163
edge_iterator begin() const
Definition lalr.h:148
std::list< iterator > outs
Definition lalr.h:179
std::list< iterator >::iterator edge_iterator
Definition lalr.h:141
bool operator==(const Node< _Tp > &other) const
Definition lalr.h:154
bool operator!=(const Node< _Tp > &other) const
Definition lalr.h:157
QPair< edge_iterator, bool > insertEdge(iterator other) const
Definition lalr.h:201
Node()
Definition lalr.h:182
_Tp data
Definition lalr.h:178
Node(_Tp d)
Definition lalr.h:184
Repository::iterator iterator
Definition lalr.h:140
std::set< Node< _Tp > > Repository
Definition lalr.h:139
static iterator end_nodes()
Definition lalr.h:166
int dfn
Definition lalr.h:177
Definition qmap.h:186
iterator end()
Definition qset.h:140
iterator find(const T &value)
Definition qset.h:159
iterator insert(const T &value)
Definition qset.h:155
\inmodule QtCore
Definition qstack.h:13
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5857
\inmodule QtCore
Definition lalr.h:269
bool operator!=(const Read &other) const
Definition lalr.h:279
bool operator<(const Read &other) const
Definition lalr.cpp:50
StatePointer state
Definition lalr.h:285
Read(StatePointer s, Name n)
Definition lalr.h:273
bool operator==(const Read &other) const
Definition lalr.h:276
Name nt
Definition lalr.h:286
Read()
Definition lalr.h:271
Definition lalr.h:50
NameList rhs
Definition lalr.h:61
Name lhs
Definition lalr.h:60
void clear()
Definition lalr.h:52
Name prec
Definition lalr.h:62
QSet< QString >::iterator it
else opt state
[0]
std::list< Item > ItemList
Definition lalr.h:34
std::set< Name > NameSet
Definition lalr.h:31
ItemList::iterator ItemPointer
Definition lalr.h:35
StateList::iterator StatePointer
Definition lalr.h:44
QTextStream & qout()
Definition lalr.cpp:26
std::list< QString >::iterator Name
Definition lalr.h:29
QMap< Name, StatePointer > Bundle
Definition lalr.h:47
std::list< State > StateList
Definition lalr.h:43
std::list< Rule > debug_infot
Definition lalr.h:38
QMultiMap< Name, RulePointer > RuleMap
Definition lalr.h:40
debug_infot::iterator RulePointer
Definition lalr.h:39
QTextStream & operator<<(QTextStream &out, const Name &n)
Definition lalr.cpp:74
QT_BEGIN_NAMESPACE QTextStream & qerr()
Definition lalr.cpp:20
std::list< Name > NameList
Definition lalr.h:30
Combined button and popup list for selecting options.
bool operator<(Name a, Name b)
Definition lalr.cpp:34
std::pair< T1, T2 > QPair
DBusConnection const char * rule
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLboolean r
[2]
GLuint GLuint end
GLenum GLuint id
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLboolean GLboolean g
GLuint name
GLfloat n
GLdouble s
[6]
Definition qopenglext.h:235
constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))
Definition qpair.h:19
QRandomGenerator64 rd
[10]
QTextStream out(stdout)
[7]
QSharedPointer< T > other(t)
[5]
QGraphicsItem * item
bool operator!=(const State &other) const
Definition lalr.h:117
QPair< ItemPointer, bool > insert(const Item &item)
Definition lalr.cpp:142
RulePointer defaultReduce
Definition lalr.h:129
QMap< Name, NameSet > reads
Definition lalr.h:127
bool operator==(const State &o) const
ItemList closure
Definition lalr.h:125
Bundle bundle
Definition lalr.h:126
QMap< Name, NameSet > follows
Definition lalr.h:128
QPair< ItemPointer, bool > insertClosure(const Item &item)
Definition lalr.cpp:152
ItemList kernel
Definition lalr.h:124