SyntaxTutor 1.0.4
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 "grammar.hpp"
24#include "slr1_parser.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 QStringList 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 const QRegularExpression kWhitespace{"\\s+"};
317};
318
319#endif // SLRTUTORWINDOW_H
Implements an SLR(1) parser for context-free grammars.
Definition slr1_parser.hpp:38
QString feedback()
Definition slrtutorwindow.cpp:1700
bool verifyResponseForCB(const QString &userResponse)
Definition slrtutorwindow.cpp:1317
QString feedbackForD()
Definition slrtutorwindow.cpp:1908
QString solution(const std::string &state)
bool verifyResponseForC(const QString &userResponse)
Definition slrtutorwindow.cpp:1296
QString feedbackForD1()
Definition slrtutorwindow.cpp:1914
std::ptrdiff_t solutionForE()
Definition slrtutorwindow.cpp:1628
QSet< QString > solutionForFA()
Definition slrtutorwindow.cpp:1665
QString feedbackForB2()
QString generateQuestion()
Generates a new question for the current tutor state.
Definition slrtutorwindow.cpp:794
std::unordered_set< Lr0Item > solutionForA4()
Definition slrtutorwindow.cpp:1562
bool verifyResponseForA3(const QString &userResponse)
Definition slrtutorwindow.cpp:1281
void wrongUserResponseAnimation()
Definition slrtutorwindow.cpp:605
QString solutionForD2()
Definition slrtutorwindow.cpp:1620
void exportConversationToPdf(const QString &filePath)
< Add message to chat
Definition slrtutorwindow.cpp:130
void updateProgressPanel()
Definition slrtutorwindow.cpp:406
void addUserState(unsigned id)
< Refresh visual progress
Definition slrtutorwindow.cpp:462
QSet< QString > solutionForG()
Definition slrtutorwindow.cpp:1681
void launchSLRWizard()
< Render SLR(1) table
bool verifyResponseForD2(const QString &userResponse)
Definition slrtutorwindow.cpp:1345
QString feedbackForA()
Definition slrtutorwindow.cpp:1766
bool verifyResponseForA(const QString &userResponse)
Definition slrtutorwindow.cpp:1268
bool verifyResponseForA1(const QString &userResponse)
Definition slrtutorwindow.cpp:1273
QString feedbackForG()
Definition slrtutorwindow.cpp:2179
QString TeachDeltaFunction(const std::unordered_set< Lr0Item > &items, const QString &symbol)
Definition slrtutorwindow.cpp:2526
bool verifyResponseForCA(const QString &userResponse)
Definition slrtutorwindow.cpp:1301
QString feedbackForB1()
void markLastUserIncorrect()
Definition slrtutorwindow.cpp:701
QStringList solutionForD()
Definition slrtutorwindow.cpp:1610
QString feedbackForA3()
Definition slrtutorwindow.cpp:1788
QString solutionForA2()
Definition slrtutorwindow.cpp:1545
void addUserTransition(unsigned fromId, const std::string &symbol, unsigned toId)
< Register a user-created state
Definition slrtutorwindow.cpp:471
QString feedbackForD2()
Definition slrtutorwindow.cpp:1945
QString feedbackForE2()
Definition slrtutorwindow.cpp:2074
QString solutionForD1()
Definition slrtutorwindow.cpp:1616
QMap< unsigned, unsigned > solutionForE2()
Definition slrtutorwindow.cpp:1645
bool verifyResponseForA4(const QString &userResponse)
Definition slrtutorwindow.cpp:1286
std::unordered_set< Lr0Item > solutionForA()
Definition slrtutorwindow.cpp:1535
QString feedbackForA2()
Definition slrtutorwindow.cpp:1781
unsigned solutionForC()
Definition slrtutorwindow.cpp:1574
QString feedbackForCA()
Definition slrtutorwindow.cpp:1844
void wrongAnimation()
Definition slrtutorwindow.cpp:575
QString TeachClosure(const std::unordered_set< Lr0Item > &initialItems)
Definition slrtutorwindow.cpp:2453
QSet< unsigned > solutionForE1()
Definition slrtutorwindow.cpp:1635
bool verifyResponseForE(const QString &userResponse)
Definition slrtutorwindow.cpp:1349
void animateLabelPop(QLabel *label)
Definition slrtutorwindow.cpp:635
QSet< unsigned > solutionForF()
Definition slrtutorwindow.cpp:1658
QString feedbackForAPrime()
Definition slrtutorwindow.cpp:1820
bool verifyResponseForF(const QString &userResponse)
Definition slrtutorwindow.cpp:1392
QString solutionForA1()
Definition slrtutorwindow.cpp:1541
QString feedbackForA4()
Definition slrtutorwindow.cpp:1809
QString FormatGrammar(const Grammar &grammar)
Definition slrtutorwindow.cpp:2371
QString feedbackForF()
Definition slrtutorwindow.cpp:2082
bool verifyResponseForG(const QString &userResponse)
Definition slrtutorwindow.cpp:1416
bool verifyResponseForD1(const QString &userResponse)
Definition slrtutorwindow.cpp:1341
bool verifyResponseForB(const QString &userResponse)
Definition slrtutorwindow.cpp:1291
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:2471
QStringList solutionForCA()
Definition slrtutorwindow.cpp:1578
QString feedbackForE1()
Definition slrtutorwindow.cpp:2028
bool verifyResponseForFA(const QString &userResponse)
Definition slrtutorwindow.cpp:1406
std::vector< std::pair< std::string, std::vector< std::string > > > solutionForA3()
Definition slrtutorwindow.cpp:1550
QString feedbackForBPrime()
bool verifyResponseForD(const QString &userResponse)
Definition slrtutorwindow.cpp:1327
QString feedbackForFA()
Definition slrtutorwindow.cpp:2137
bool verifyResponseForE2(const QString &userResponse)
Definition slrtutorwindow.cpp:1370
QString feedbackForC()
Definition slrtutorwindow.cpp:1838
QString feedbackForDPrime()
Definition slrtutorwindow.cpp:1976
void sessionFinished(int cntRight, int cntWrong)
std::unordered_set< Lr0Item > solutionForCB()
Definition slrtutorwindow.cpp:1603
void animateLabelColor(QLabel *label, const QColor &flashColor)
Definition slrtutorwindow.cpp:670
void updateState(bool isCorrect)
Updates tutor state based on whether the last answer was correct.
Definition slrtutorwindow.cpp:1029
bool verifyResponse(const QString &userResponse)
Definition slrtutorwindow.cpp:1200
bool verifyResponseForE1(const QString &userResponse)
Definition slrtutorwindow.cpp:1355
bool verifyResponseForA2(const QString &userResponse)
Definition slrtutorwindow.cpp:1277
QString feedbackForB()
Definition slrtutorwindow.cpp:1830
QString feedbackForA1()
Definition slrtutorwindow.cpp:1774
QString feedbackForCB()
Definition slrtutorwindow.cpp:1903
QString feedbackForE()
Definition slrtutorwindow.cpp:2021
void showTable()
< Export full interaction
Definition slrtutorwindow.cpp:285
~SLRTutorWindow()
Definition slrtutorwindow.cpp:126
void fillSortedGrammar()
< Utility for displaying grammar
Definition slrtutorwindow.cpp:2408
void addMessage(const QString &text, bool isUser)
< Prepares grammar in display-friendly format
Definition slrtutorwindow.cpp:477
bool verifyResponseForH()
Definition slrtutorwindow.cpp:1427
void closeEvent(QCloseEvent *event) override
Definition slrtutorwindow.h:227
unsigned solutionForB()
Definition slrtutorwindow.cpp:1570
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
StateSlr
Definition slrtutorwindow.h:51
@ H_prime
Definition slrtutorwindow.h:73
@ A4
Definition slrtutorwindow.h:56
@ C
Definition slrtutorwindow.h:59
@ A1
Definition slrtutorwindow.h:53
@ 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
@ A
Definition slrtutorwindow.h:52
@ F
Definition slrtutorwindow.h:69
@ CB
Definition slrtutorwindow.h:61
@ B
Definition slrtutorwindow.h:58
@ H
Definition slrtutorwindow.h:72
@ D2
Definition slrtutorwindow.h:64
@ A2
Definition slrtutorwindow.h:54
@ FA
Definition slrtutorwindow.h:70
@ fin
Definition slrtutorwindow.h:74
@ A_prime
Definition slrtutorwindow.h:57
@ 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