SyntaxTutor
Educational app designed to help compiler students understand LL(1) and SLR(1) parsing algorithms.
Loading...
Searching...
No Matches
slrtutorwindow.h
Go to the documentation of this file.
1/*
2 * SyntaxTutor - Interactive Tutorial About Syntax Analyzers
3 * Copyright (C) 2025 Jose R. (jose-rzm)
4 *
5 * This program is free software: you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
19#ifndef SLRTUTORWINDOW_H
20#define SLRTUTORWINDOW_H
21
22#include "UniqueQueue.h"
23#include "backend/grammar.hpp"
25#include "slrtabledialog.h"
26#include <QAbstractItemView>
27#include <QDialog>
28#include <QFileDialog>
29#include <QGraphicsColorizeEffect>
30#include <QListWidgetItem>
31#include <QMainWindow>
32#include <QMessageBox>
33#include <QPropertyAnimation>
34#include <QPushButton>
35#include <QRegularExpression>
36#include <QScrollBar>
37#include <QShortcut>
38#include <QTableWidget>
39#include <QTextDocument>
40#include <QTextEdit>
41#include <QTime>
42#include <QTimer>
43#include <QVBoxLayout>
44#include <QtPrintSupport/QPrinter>
45
46namespace Ui {
47class SLRTutorWindow;
48}
49
50// ====== SLR(1) Tutor States =====================================
76
77class TutorialManager;
78
79// ====== Main Tutor Class for SLR(1) =============================
94class SLRTutorWindow : public QMainWindow {
95 Q_OBJECT
96
97 public:
98 // ====== Constructor / Destructor =============================
105 explicit SLRTutorWindow(const Grammar& g, TutorialManager* tm = nullptr,
106 QWidget* parent = nullptr);
108
109 // ====== Core Flow Control =====================================
114 QString generateQuestion();
115
120 void updateState(bool isCorrect);
121 QString
122 FormatGrammar(const Grammar& grammar);
123 void fillSortedGrammar();
124
125 // ====== UI Interaction ========================================
126 void addMessage(const QString& text, bool isUser);
128 const QString& filePath);
129 void showTable();
131 void updateProgressPanel();
132 void addUserState(unsigned id);
133 void addUserTransition(unsigned fromId, const std::string& symbol,
134 unsigned toId); // Register a user-created transition
135
136 // ====== Visual Feedback & Animations ==========================
137 void animateLabelPop(QLabel* label);
138 void animateLabelColor(QLabel* label, const QColor& flashColor);
139 void wrongAnimation(); // Label animation for incorrect answer
140 void wrongUserResponseAnimation(); // Message widget animation for incorrect
141 // answer
143
144 // ====== Response Verification ================================
145 bool verifyResponse(const QString& userResponse);
146 bool verifyResponseForA(const QString& userResponse);
147 bool verifyResponseForA1(const QString& userResponse);
148 bool verifyResponseForA2(const QString& userResponse);
149 bool verifyResponseForA3(const QString& userResponse);
150 bool verifyResponseForA4(const QString& userResponse);
151 bool verifyResponseForB(const QString& userResponse);
152 bool verifyResponseForC(const QString& userResponse);
153 bool verifyResponseForCA(const QString& userResponse);
154 bool verifyResponseForCB(const QString& userResponse);
155 bool verifyResponseForD(const QString& userResponse);
156 bool verifyResponseForD1(const QString& userResponse);
157 bool verifyResponseForD2(const QString& userResponse);
158 bool verifyResponseForE(const QString& userResponse);
159 bool verifyResponseForE1(const QString& userResponse);
160 bool verifyResponseForE2(const QString& userResponse);
161 bool verifyResponseForF(const QString& userResponse);
162 bool verifyResponseForFA(const QString& userResponse);
163 bool verifyResponseForG(const QString& userResponse);
164 bool verifyResponseForH();
165
166 // ====== Correct Solutions (Auto-generated) ====================
167 QString solution(const std::string& state);
168 std::unordered_set<Lr0Item> solutionForA();
169 QString solutionForA1();
170 QString solutionForA2();
171 std::vector<std::pair<std::string, std::vector<std::string>>>
173 std::unordered_set<Lr0Item> solutionForA4();
174 unsigned solutionForB();
175 unsigned solutionForC();
176 QStringList solutionForCA();
177 std::unordered_set<Lr0Item> solutionForCB();
178 QString solutionForD();
179 QString solutionForD1();
180 QString solutionForD2();
181 std::ptrdiff_t solutionForE();
182 QSet<unsigned> solutionForE1();
183 QMap<unsigned, unsigned> solutionForE2();
184 QSet<unsigned> solutionForF();
185 QSet<QString> solutionForFA();
186 QSet<QString> solutionForG();
187
188 // ====== Pedagogical Feedback ==================================
189 QString feedback(); // Delegates to appropriate feedback based on state
190 QString feedbackForA();
191 QString feedbackForA1();
192 QString feedbackForA2();
193 QString feedbackForA3();
194 QString feedbackForA4();
195 QString feedbackForAPrime();
196 QString feedbackForB();
197 QString feedbackForB1();
198 QString feedbackForB2();
200 QString feedbackForC();
201 QString feedbackForCA();
202 QString feedbackForCB();
203 QString feedbackForD();
204 QString feedbackForD1();
205 QString feedbackForD2();
206 QString feedbackForDPrime();
207 QString feedbackForE();
208 QString feedbackForE1();
209 QString feedbackForE2();
210 QString feedbackForF();
211 QString feedbackForFA();
212 QString feedbackForG();
213 QString TeachDeltaFunction(const std::unordered_set<Lr0Item>& items,
214 const QString& symbol);
215 void TeachClosureStep(std::unordered_set<Lr0Item>& items, unsigned int size,
216 std::unordered_set<std::string>& visited, int depth,
217 QString& output);
218 QString TeachClosure(const std::unordered_set<Lr0Item>& initialItems);
219 private slots:
220 void on_confirmButton_clicked();
221 void on_userResponse_textChanged();
222
223 signals:
224 void sessionFinished(int cntRight, int cntWrong);
225
226 protected:
227 void closeEvent(QCloseEvent* event) override {
228 emit sessionFinished(cntRightAnswers, cntWrongAnswers);
229 QWidget::closeEvent(event);
230 }
231
232 private:
233 // ====== Helper Functions ======================================
234 std::vector<std::string> qvectorToStdVector(const QVector<QString>& qvec);
235 QVector<QString> stdVectorToQVector(const std::vector<std::string>& vec);
236 QSet<QString>
237 stdUnorderedSetToQSet(const std::unordered_set<std::string>& uset);
238 std::unordered_set<std::string>
239 qsetToStdUnorderedSet(const QSet<QString>& qset);
240 std::unordered_set<Lr0Item> ingestUserItems(const QString& userResponse);
241 std::vector<std::pair<std::string, std::vector<std::string>>>
242 ingestUserRules(const QString& userResponse);
243 void setupTutorial();
244 // ====== Core Components ========================================
245 Ui::SLRTutorWindow* ui;
246 Grammar grammar;
247 SLR1Parser slr1;
248
249 // ====== State and Grammar Tracking =============================
250 StateSlr currentState;
251 QVector<QString> sortedNonTerminals;
252 QVector<QPair<QString, QVector<QString>>> sortedGrammar;
253 QString formattedGrammar;
254
255 unsigned cntRightAnswers = 0;
256 unsigned cntWrongAnswers = 0;
257
258 // ====== State Machine Runtime Variables ========================
259 std::unordered_set<state> userMadeStates; // All states the user has created
260 std::unordered_map<unsigned, std::unordered_map<std::string, unsigned>>
261 userMadeTransitions; // Transitions made by the user
263 statesIdQueue; // States to be processed in B-C-CA-CB loop
264 unsigned currentStateId = 0;
265 state currentSlrState;
266
267 QStringList followSymbols; // Used in CA-CB loop
268 qsizetype currentFollowSymbolsIdx = 0;
269 unsigned int nextStateId = 0;
270
271 QVector<const state*> statesWithLr0Conflict; // Populated in F
272 std::queue<unsigned> conflictStatesIdQueue;
273 unsigned currentConflictStateId = 0;
274 state currentConflictState;
275
276 std::queue<unsigned>
277 reduceStatesIdQueue; // States without conflicts but with reduce
278 unsigned currentReduceStateId = 0;
279 state currentReduceState;
280
281 struct ActionEntry {
282 enum Type { Shift, Reduce, Accept, Goto } type;
283 int target;
284 static ActionEntry makeShift(int s) { return {Shift, s}; }
285 static ActionEntry makeReduce(int r) { return {Reduce, r}; }
286 static ActionEntry makeAccept() { return {Accept, 0}; }
287 static ActionEntry makeGoto(int g) { return {Goto, g}; }
288 };
289
290 QMap<int, QMap<QString, ActionEntry>> slrtable;
291 QVector<QVector<QString>> rawTable;
292
293 // ====== Conversation Log =======================================
294 struct MessageLog {
295 QString message;
296 bool isUser;
297 bool isCorrect = true;
298
299 MessageLog(const QString& message, bool isUser)
300 : message(message), isUser(isUser) {}
301
302 void toggleIsCorrect() { isCorrect = false; }
303 };
304
305 QVector<MessageLog> conversationLog;
306 QWidget* lastUserMessage = nullptr;
307 qsizetype lastUserMessageLogIdx = -1;
308
309 QPropertyAnimation* m_shakeAnimation =
310 nullptr; // For interrupting userResponse animation if they spam enter
311 // key
312
313 TutorialManager* tm;
314
315 QRegularExpression re{"^\\s+|\\s+$"};
316};
317
318#endif // SLRTUTORWINDOW_H
Implements an SLR(1) parser for context-free grammars.
Definition slr1_parser.hpp:38
QString feedback()
Definition slrtutorwindow.cpp:1679
bool verifyResponseForCB(const QString &userResponse)
Definition slrtutorwindow.cpp:1308
QString feedbackForD()
Definition slrtutorwindow.cpp:1887
QString solution(const std::string &state)
bool verifyResponseForC(const QString &userResponse)
Definition slrtutorwindow.cpp:1287
QString feedbackForD1()
Definition slrtutorwindow.cpp:1893
std::ptrdiff_t solutionForE()
Definition slrtutorwindow.cpp:1607
QSet< QString > solutionForFA()
Definition slrtutorwindow.cpp:1644
QString feedbackForB2()
QString generateQuestion()
Generates a new question for the current tutor state.
Definition slrtutorwindow.cpp:793
std::unordered_set< Lr0Item > solutionForA4()
Definition slrtutorwindow.cpp:1543
bool verifyResponseForA3(const QString &userResponse)
Definition slrtutorwindow.cpp:1272
void wrongUserResponseAnimation()
Definition slrtutorwindow.cpp:604
QString solutionForD2()
Definition slrtutorwindow.cpp:1599
void exportConversationToPdf(const QString &filePath)
< Add message to chat
Definition slrtutorwindow.cpp:130
void updateProgressPanel()
Definition slrtutorwindow.cpp:405
void addUserState(unsigned id)
< Refresh visual progress
Definition slrtutorwindow.cpp:461
QSet< QString > solutionForG()
Definition slrtutorwindow.cpp:1660
void launchSLRWizard()
< Render SLR(1) table
bool verifyResponseForD2(const QString &userResponse)
Definition slrtutorwindow.cpp:1326
QString feedbackForA()
Definition slrtutorwindow.cpp:1745
bool verifyResponseForA(const QString &userResponse)
Definition slrtutorwindow.cpp:1259
bool verifyResponseForA1(const QString &userResponse)
Definition slrtutorwindow.cpp:1264
QString feedbackForG()
Definition slrtutorwindow.cpp:2158
QString TeachDeltaFunction(const std::unordered_set< Lr0Item > &items, const QString &symbol)
Definition slrtutorwindow.cpp:2494
bool verifyResponseForCA(const QString &userResponse)
Definition slrtutorwindow.cpp:1292
QString feedbackForB1()
void markLastUserIncorrect()
Definition slrtutorwindow.cpp:700
QString feedbackForA3()
Definition slrtutorwindow.cpp:1767
QString solutionForA2()
Definition slrtutorwindow.cpp:1526
void addUserTransition(unsigned fromId, const std::string &symbol, unsigned toId)
< Register a user-created state
Definition slrtutorwindow.cpp:470
QString feedbackForD2()
Definition slrtutorwindow.cpp:1924
QString feedbackForE2()
Definition slrtutorwindow.cpp:2053
QString solutionForD1()
Definition slrtutorwindow.cpp:1595
QMap< unsigned, unsigned > solutionForE2()
Definition slrtutorwindow.cpp:1624
bool verifyResponseForA4(const QString &userResponse)
Definition slrtutorwindow.cpp:1277
std::unordered_set< Lr0Item > solutionForA()
Definition slrtutorwindow.cpp:1516
QString feedbackForA2()
Definition slrtutorwindow.cpp:1760
unsigned solutionForC()
Definition slrtutorwindow.cpp:1555
QString solutionForD()
Definition slrtutorwindow.cpp:1591
QString feedbackForCA()
Definition slrtutorwindow.cpp:1823
void wrongAnimation()
Definition slrtutorwindow.cpp:574
QString TeachClosure(const std::unordered_set< Lr0Item > &initialItems)
Definition slrtutorwindow.cpp:2421
QSet< unsigned > solutionForE1()
Definition slrtutorwindow.cpp:1614
bool verifyResponseForE(const QString &userResponse)
Definition slrtutorwindow.cpp:1330
void animateLabelPop(QLabel *label)
Definition slrtutorwindow.cpp:634
QSet< unsigned > solutionForF()
Definition slrtutorwindow.cpp:1637
QString feedbackForAPrime()
Definition slrtutorwindow.cpp:1799
bool verifyResponseForF(const QString &userResponse)
Definition slrtutorwindow.cpp:1373
QString solutionForA1()
Definition slrtutorwindow.cpp:1522
QString feedbackForA4()
Definition slrtutorwindow.cpp:1788
QString FormatGrammar(const Grammar &grammar)
Definition slrtutorwindow.cpp:2339
QString feedbackForF()
Definition slrtutorwindow.cpp:2061
bool verifyResponseForG(const QString &userResponse)
Definition slrtutorwindow.cpp:1397
bool verifyResponseForD1(const QString &userResponse)
Definition slrtutorwindow.cpp:1322
bool verifyResponseForB(const QString &userResponse)
Definition slrtutorwindow.cpp:1282
SLRTutorWindow(const Grammar &g, TutorialManager *tm=nullptr, QWidget *parent=nullptr)
Constructs the SLR(1) tutor window with a given grammar.
Definition slrtutorwindow.cpp:26
void TeachClosureStep(std::unordered_set< Lr0Item > &items, unsigned int size, std::unordered_set< std::string > &visited, int depth, QString &output)
Definition slrtutorwindow.cpp:2439
QStringList solutionForCA()
Definition slrtutorwindow.cpp:1559
QString feedbackForE1()
Definition slrtutorwindow.cpp:2007
bool verifyResponseForFA(const QString &userResponse)
Definition slrtutorwindow.cpp:1387
std::vector< std::pair< std::string, std::vector< std::string > > > solutionForA3()
Definition slrtutorwindow.cpp:1531
QString feedbackForBPrime()
bool verifyResponseForD(const QString &userResponse)
Definition slrtutorwindow.cpp:1318
QString feedbackForFA()
Definition slrtutorwindow.cpp:2116
bool verifyResponseForE2(const QString &userResponse)
Definition slrtutorwindow.cpp:1351
QString feedbackForC()
Definition slrtutorwindow.cpp:1817
QString feedbackForDPrime()
Definition slrtutorwindow.cpp:1955
void sessionFinished(int cntRight, int cntWrong)
std::unordered_set< Lr0Item > solutionForCB()
Definition slrtutorwindow.cpp:1584
void animateLabelColor(QLabel *label, const QColor &flashColor)
Definition slrtutorwindow.cpp:669
void updateState(bool isCorrect)
Updates tutor state based on whether the last answer was correct.
Definition slrtutorwindow.cpp:1020
bool verifyResponse(const QString &userResponse)
Definition slrtutorwindow.cpp:1191
bool verifyResponseForE1(const QString &userResponse)
Definition slrtutorwindow.cpp:1336
bool verifyResponseForA2(const QString &userResponse)
Definition slrtutorwindow.cpp:1268
QString feedbackForB()
Definition slrtutorwindow.cpp:1809
QString feedbackForA1()
Definition slrtutorwindow.cpp:1753
QString feedbackForCB()
Definition slrtutorwindow.cpp:1882
QString feedbackForE()
Definition slrtutorwindow.cpp:2000
void showTable()
< Export full interaction
Definition slrtutorwindow.cpp:285
~SLRTutorWindow()
Definition slrtutorwindow.cpp:126
void fillSortedGrammar()
< Utility for displaying grammar
Definition slrtutorwindow.cpp:2376
void addMessage(const QString &text, bool isUser)
< Prepares grammar in display-friendly format
Definition slrtutorwindow.cpp:476
bool verifyResponseForH()
Definition slrtutorwindow.cpp:1408
void closeEvent(QCloseEvent *event) override
Definition slrtutorwindow.h:227
unsigned solutionForB()
Definition slrtutorwindow.cpp:1551
Manages interactive tutorials by highlighting UI elements and guiding the user.
Definition tutorialmanager.h:53
A queue that ensures each element is inserted only once.
Definition UniqueQueue.h:37
@ C
Definition lltutorwindow.h:57
@ A1
Definition lltutorwindow.h:57
@ A
Definition lltutorwindow.h:57
@ B
Definition lltutorwindow.h:57
@ A2
Definition lltutorwindow.h:57
@ fin
Definition lltutorwindow.h:57
@ A_prime
Definition lltutorwindow.h:57
StateSlr
Definition slrtutorwindow.h:51
@ H_prime
Definition slrtutorwindow.h:73
@ A4
Definition slrtutorwindow.h:56
@ E
Definition slrtutorwindow.h:66
@ CA
Definition slrtutorwindow.h:60
@ E1
Definition slrtutorwindow.h:67
@ D1
Definition slrtutorwindow.h:63
@ E2
Definition slrtutorwindow.h:68
@ A3
Definition slrtutorwindow.h:55
@ D_prime
Definition slrtutorwindow.h:65
@ F
Definition slrtutorwindow.h:69
@ CB
Definition slrtutorwindow.h:61
@ H
Definition slrtutorwindow.h:72
@ D2
Definition slrtutorwindow.h:64
@ FA
Definition slrtutorwindow.h:70
@ G
Definition slrtutorwindow.h:71
@ D
Definition slrtutorwindow.h:62
Represents a context-free grammar, including its rules, symbol table, and starting symbol.
Definition grammar.hpp:46
Represents a state in the LR(0) automaton.
Definition state.hpp:33