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#ifndef SLRTUTORWINDOW_H
2#define SLRTUTORWINDOW_H
3
4#include <QAbstractItemView>
5#include <QDialog>
6#include <QFileDialog>
7#include <QGraphicsColorizeEffect>
8#include <QListWidgetItem>
9#include <QMainWindow>
10#include <QMessageBox>
11#include <QPropertyAnimation>
12#include <QPushButton>
13#include <QRegularExpression>
14#include <QScrollBar>
15#include <QShortcut>
16#include <QTableWidget>
17#include <QTextDocument>
18#include <QTextEdit>
19#include <QTime>
20#include <QTimer>
21#include <QVBoxLayout>
22#include <QtPrintSupport/QPrinter>
23#include "UniqueQueue.h"
24#include "backend/grammar.hpp"
26#include "slrtabledialog.h"
27
28namespace Ui {
29class SLRTutorWindow;
30}
31
32// ====== SLR(1) Tutor States =====================================
58
59class TutorialManager;
60
61// ====== Main Tutor Class for SLR(1) =============================
76class SLRTutorWindow : public QMainWindow
77{
78 Q_OBJECT
79
80public:
81 // ====== Constructor / Destructor =============================
88 explicit SLRTutorWindow(const Grammar &g,
89 TutorialManager *tm = nullptr,
90 QWidget *parent = nullptr);
92
93 // ====== Core Flow Control =====================================
98 QString generateQuestion();
99
104 void updateState(bool isCorrect);
105 QString FormatGrammar(const Grammar &grammar);
106 void fillSortedGrammar();
107
108 // ====== UI Interaction ========================================
109 void addMessage(const QString &text, bool isUser);
110 void exportConversationToPdf(const QString &filePath);
111 void showTable();
113 void updateProgressPanel();
114 void addUserState(unsigned id);
115 void addUserTransition(unsigned fromId,
116 const std::string &symbol,
117 unsigned toId); // Register a user-created transition
118
119 // ====== Visual Feedback & Animations ==========================
120 void animateLabelPop(QLabel *label);
121 void animateLabelColor(QLabel *label, const QColor &flashColor);
122 void wrongAnimation(); // Label animation for incorrect answer
123 void wrongUserResponseAnimation(); // Message widget animation for incorrect answer
125
126 // ====== Response Verification ================================
127 bool verifyResponse(const QString &userResponse);
128 bool verifyResponseForA(const QString &userResponse);
129 bool verifyResponseForA1(const QString &userResponse);
130 bool verifyResponseForA2(const QString &userResponse);
131 bool verifyResponseForA3(const QString &userResponse);
132 bool verifyResponseForA4(const QString &userResponse);
133 bool verifyResponseForB(const QString &userResponse);
134 bool verifyResponseForC(const QString &userResponse);
135 bool verifyResponseForCA(const QString &userResponse);
136 bool verifyResponseForCB(const QString &userResponse);
137 bool verifyResponseForD(const QString &userResponse);
138 bool verifyResponseForD1(const QString &userResponse);
139 bool verifyResponseForD2(const QString &userResponse);
140 bool verifyResponseForE(const QString &userResponse);
141 bool verifyResponseForE1(const QString &userResponse);
142 bool verifyResponseForE2(const QString &userResponse);
143 bool verifyResponseForF(const QString &userResponse);
144 bool verifyResponseForFA(const QString &userResponse);
145 bool verifyResponseForG(const QString &userResponse);
146 bool verifyResponseForH();
147
148 // ====== Correct Solutions (Auto-generated) ====================
149 QString solution(const std::string &state);
150 std::unordered_set<Lr0Item> solutionForA();
151 QString solutionForA1();
152 QString solutionForA2();
153 std::vector<std::pair<std::string, std::vector<std::string>>> solutionForA3();
154 std::unordered_set<Lr0Item> solutionForA4();
155 unsigned solutionForB();
156 unsigned solutionForC();
157 QStringList solutionForCA();
158 std::unordered_set<Lr0Item> solutionForCB();
159 QString solutionForD();
160 QString solutionForD1();
161 QString solutionForD2();
162 std::ptrdiff_t solutionForE();
163 QSet<unsigned> solutionForE1();
164 QMap<unsigned, unsigned> solutionForE2();
165 QSet<unsigned> solutionForF();
166 QSet<QString> solutionForFA();
167 QSet<QString> solutionForG();
168
169 // ====== Pedagogical Feedback ==================================
170 QString feedback(); // Delegates to appropriate feedback based on state
171 QString feedbackForA();
172 QString feedbackForA1();
173 QString feedbackForA2();
174 QString feedbackForA3();
175 QString feedbackForA4();
176 QString feedbackForAPrime();
177 QString feedbackForB();
178 QString feedbackForB1();
179 QString feedbackForB2();
181 QString feedbackForC();
182 QString feedbackForCA();
183 QString feedbackForCB();
184 QString feedbackForD();
185 QString feedbackForD1();
186 QString feedbackForD2();
187 QString feedbackForDPrime();
188 QString feedbackForE();
189 QString feedbackForE1();
190 QString feedbackForE2();
191 QString feedbackForF();
192 QString feedbackForFA();
193 QString feedbackForG();
194 QString TeachDeltaFunction(const std::unordered_set<Lr0Item> &items, const QString &symbol);
195 void TeachClosureStep(std::unordered_set<Lr0Item> &items,
196 unsigned int size,
197 std::unordered_set<std::string> &visited,
198 int depth,
199 QString &output);
200 QString TeachClosure(const std::unordered_set<Lr0Item> &initialItems);
201private slots:
202 void on_confirmButton_clicked();
203 void on_userResponse_textChanged();
204
205signals:
206 void sessionFinished(int cntRight, int cntWrong);
207
208protected:
209 void closeEvent(QCloseEvent *event) override
210 {
211 emit sessionFinished(cntRightAnswers, cntWrongAnswers);
212 QWidget::closeEvent(event);
213 }
214
215private:
216 // ====== Helper Functions ======================================
217 std::vector<std::string> qvectorToStdVector(const QVector<QString> &qvec);
218 QVector<QString> stdVectorToQVector(const std::vector<std::string> &vec);
219 QSet<QString> stdUnorderedSetToQSet(const std::unordered_set<std::string> &uset);
220 std::unordered_set<std::string> qsetToStdUnorderedSet(const QSet<QString> &qset);
221 std::unordered_set<Lr0Item> ingestUserItems(const QString &userResponse);
222 std::vector<std::pair<std::string, std::vector<std::string>>> ingestUserRules(
223 const QString &userResponse);
224 void setupTutorial();
225 // ====== Core Components ========================================
226 Ui::SLRTutorWindow *ui;
227 Grammar grammar;
228 SLR1Parser slr1;
229
230 // ====== State and Grammar Tracking =============================
231 StateSlr currentState;
232 QVector<QString> sortedNonTerminals;
233 QVector<QPair<QString, QVector<QString>>> sortedGrammar;
234 QString formattedGrammar;
235
236 unsigned cntRightAnswers = 0;
237 unsigned cntWrongAnswers = 0;
238
239 // ====== State Machine Runtime Variables ========================
240 std::unordered_set<state> userMadeStates; // All states the user has created
241 std::unordered_map<unsigned, std::unordered_map<std::string, unsigned>>
242 userMadeTransitions; // Transitions made by the user
243 UniqueQueue<unsigned> statesIdQueue; // States to be processed in B-C-CA-CB loop
244 unsigned currentStateId = 0;
245 state currentSlrState;
246
247 QStringList followSymbols; // Used in CA-CB loop
248 qsizetype currentFollowSymbolsIdx = 0;
249 unsigned int nextStateId = 0;
250
251 QVector<const state *> statesWithLr0Conflict; // Populated in F
252 std::queue<unsigned> conflictStatesIdQueue;
253 unsigned currentConflictStateId = 0;
254 state currentConflictState;
255
256 std::queue<unsigned> reduceStatesIdQueue; // States without conflicts but with reduce
257 unsigned currentReduceStateId = 0;
258 state currentReduceState;
259
260 struct ActionEntry
261 {
262 enum Type { Shift, Reduce, Accept, Goto } type;
263 int target;
264 static ActionEntry makeShift(int s) { return {Shift, s}; }
265 static ActionEntry makeReduce(int r) { return {Reduce, r}; }
266 static ActionEntry makeAccept() { return {Accept, 0}; }
267 static ActionEntry makeGoto(int g) { return {Goto, g}; }
268 };
269
270 QMap<int, QMap<QString, ActionEntry>> slrtable;
271 QVector<QVector<QString>> rawTable;
272
273 // ====== Conversation Log =======================================
274 struct MessageLog
275 {
276 QString message;
277 bool isUser;
278 bool isCorrect;
279
280 MessageLog(const QString &message, bool isUser)
281 : message(message)
282 , isUser(isUser)
283 {}
284
285 void toggleIsCorrect() { isCorrect = false; }
286 };
287
288 QVector<MessageLog> conversationLog;
289 QWidget *lastUserMessage = nullptr;
290 qsizetype lastUserMessageLogIdx = -1;
291
292 QPropertyAnimation *m_shakeAnimation
293 = nullptr; // For interrupting userResponse animation if they spam enter key
294
295 TutorialManager *tm;
296
297 QRegularExpression re{"^\\s+|\\s+$"};
298};
299
300#endif // SLRTUTORWINDOW_H
Implements an SLR(1) parser for context-free grammars.
Definition slr1_parser.hpp:20
QString feedback()
Definition slrtutorwindow.cpp:1988
bool verifyResponseForCB(const QString &userResponse)
Definition slrtutorwindow.cpp:1617
QString feedbackForD()
Definition slrtutorwindow.cpp:2195
QString solution(const std::string &state)
bool verifyResponseForC(const QString &userResponse)
Definition slrtutorwindow.cpp:1596
QString feedbackForD1()
Definition slrtutorwindow.cpp:2201
std::ptrdiff_t solutionForE()
Definition slrtutorwindow.cpp:1916
QSet< QString > solutionForFA()
Definition slrtutorwindow.cpp:1953
QString feedbackForB2()
QString generateQuestion()
Generates a new question for the current tutor state.
Definition slrtutorwindow.cpp:1011
std::unordered_set< Lr0Item > solutionForA4()
Definition slrtutorwindow.cpp:1852
bool verifyResponseForA3(const QString &userResponse)
Definition slrtutorwindow.cpp:1581
void wrongUserResponseAnimation()
Definition slrtutorwindow.cpp:781
QString solutionForD2()
Definition slrtutorwindow.cpp:1908
void exportConversationToPdf(const QString &filePath)
< Add message to chat
Definition slrtutorwindow.cpp:112
void updateProgressPanel()
Definition slrtutorwindow.cpp:552
void addUserState(unsigned id)
< Refresh visual progress
Definition slrtutorwindow.cpp:611
QSet< QString > solutionForG()
Definition slrtutorwindow.cpp:1969
void launchSLRWizard()
< Render SLR(1) table
bool verifyResponseForD2(const QString &userResponse)
Definition slrtutorwindow.cpp:1635
QString feedbackForA()
Definition slrtutorwindow.cpp:2054
bool verifyResponseForA(const QString &userResponse)
Definition slrtutorwindow.cpp:1568
bool verifyResponseForA1(const QString &userResponse)
Definition slrtutorwindow.cpp:1573
QString feedbackForG()
Definition slrtutorwindow.cpp:2465
QString TeachDeltaFunction(const std::unordered_set< Lr0Item > &items, const QString &symbol)
Definition slrtutorwindow.cpp:2801
bool verifyResponseForCA(const QString &userResponse)
Definition slrtutorwindow.cpp:1601
QString feedbackForB1()
void markLastUserIncorrect()
Definition slrtutorwindow.cpp:877
QString feedbackForA3()
Definition slrtutorwindow.cpp:2076
QString solutionForA2()
Definition slrtutorwindow.cpp:1835
void addUserTransition(unsigned fromId, const std::string &symbol, unsigned toId)
< Register a user-created state
Definition slrtutorwindow.cpp:620
QString feedbackForD2()
Definition slrtutorwindow.cpp:2232
QString feedbackForE2()
Definition slrtutorwindow.cpp:2361
QString solutionForD1()
Definition slrtutorwindow.cpp:1904
QMap< unsigned, unsigned > solutionForE2()
Definition slrtutorwindow.cpp:1933
bool verifyResponseForA4(const QString &userResponse)
Definition slrtutorwindow.cpp:1586
std::unordered_set< Lr0Item > solutionForA()
Definition slrtutorwindow.cpp:1825
QString feedbackForA2()
Definition slrtutorwindow.cpp:2069
unsigned solutionForC()
Definition slrtutorwindow.cpp:1864
QString solutionForD()
Definition slrtutorwindow.cpp:1900
QString feedbackForCA()
Definition slrtutorwindow.cpp:2132
void wrongAnimation()
Definition slrtutorwindow.cpp:751
QString TeachClosure(const std::unordered_set< Lr0Item > &initialItems)
Definition slrtutorwindow.cpp:2728
QSet< unsigned > solutionForE1()
Definition slrtutorwindow.cpp:1923
bool verifyResponseForE(const QString &userResponse)
Definition slrtutorwindow.cpp:1639
void animateLabelPop(QLabel *label)
Definition slrtutorwindow.cpp:811
QSet< unsigned > solutionForF()
Definition slrtutorwindow.cpp:1946
QString feedbackForAPrime()
Definition slrtutorwindow.cpp:2108
bool verifyResponseForF(const QString &userResponse)
Definition slrtutorwindow.cpp:1682
QString solutionForA1()
Definition slrtutorwindow.cpp:1831
QString feedbackForA4()
Definition slrtutorwindow.cpp:2097
QString FormatGrammar(const Grammar &grammar)
Definition slrtutorwindow.cpp:2646
QString feedbackForF()
Definition slrtutorwindow.cpp:2369
bool verifyResponseForG(const QString &userResponse)
Definition slrtutorwindow.cpp:1706
bool verifyResponseForD1(const QString &userResponse)
Definition slrtutorwindow.cpp:1631
bool verifyResponseForB(const QString &userResponse)
Definition slrtutorwindow.cpp:1591
SLRTutorWindow(const Grammar &g, TutorialManager *tm=nullptr, QWidget *parent=nullptr)
Constructs the SLR(1) tutor window with a given grammar.
Definition slrtutorwindow.cpp:8
void TeachClosureStep(std::unordered_set< Lr0Item > &items, unsigned int size, std::unordered_set< std::string > &visited, int depth, QString &output)
Definition slrtutorwindow.cpp:2746
QStringList solutionForCA()
Definition slrtutorwindow.cpp:1868
QString feedbackForE1()
Definition slrtutorwindow.cpp:2315
bool verifyResponseForFA(const QString &userResponse)
Definition slrtutorwindow.cpp:1696
std::vector< std::pair< std::string, std::vector< std::string > > > solutionForA3()
Definition slrtutorwindow.cpp:1840
QString feedbackForBPrime()
bool verifyResponseForD(const QString &userResponse)
Definition slrtutorwindow.cpp:1627
QString feedbackForFA()
Definition slrtutorwindow.cpp:2424
bool verifyResponseForE2(const QString &userResponse)
Definition slrtutorwindow.cpp:1660
QString feedbackForC()
Definition slrtutorwindow.cpp:2126
QString feedbackForDPrime()
Definition slrtutorwindow.cpp:2263
void sessionFinished(int cntRight, int cntWrong)
std::unordered_set< Lr0Item > solutionForCB()
Definition slrtutorwindow.cpp:1893
void animateLabelColor(QLabel *label, const QColor &flashColor)
Definition slrtutorwindow.cpp:846
void updateState(bool isCorrect)
Updates tutor state based on whether the last answer was correct.
Definition slrtutorwindow.cpp:1329
bool verifyResponse(const QString &userResponse)
Definition slrtutorwindow.cpp:1500
bool verifyResponseForE1(const QString &userResponse)
Definition slrtutorwindow.cpp:1645
bool verifyResponseForA2(const QString &userResponse)
Definition slrtutorwindow.cpp:1577
QString feedbackForB()
Definition slrtutorwindow.cpp:2118
QString feedbackForA1()
Definition slrtutorwindow.cpp:2062
QString feedbackForCB()
Definition slrtutorwindow.cpp:2190
QString feedbackForE()
Definition slrtutorwindow.cpp:2308
void showTable()
< Export full interaction
Definition slrtutorwindow.cpp:356
~SLRTutorWindow()
Definition slrtutorwindow.cpp:108
void fillSortedGrammar()
< Utility for displaying grammar
Definition slrtutorwindow.cpp:2683
void addMessage(const QString &text, bool isUser)
< Prepares grammar in display-friendly format
Definition slrtutorwindow.cpp:626
bool verifyResponseForH()
Definition slrtutorwindow.cpp:1717
void closeEvent(QCloseEvent *event) override
Definition slrtutorwindow.h:209
unsigned solutionForB()
Definition slrtutorwindow.cpp:1860
Manages interactive tutorials by highlighting UI elements and guiding the user.
Definition tutorialmanager.h:35
A queue that ensures each element is inserted only once.
Definition UniqueQueue.h:17
@ C
Definition lltutorwindow.h:39
@ A1
Definition lltutorwindow.h:39
@ A
Definition lltutorwindow.h:39
@ B
Definition lltutorwindow.h:39
@ A2
Definition lltutorwindow.h:39
@ fin
Definition lltutorwindow.h:39
@ A_prime
Definition lltutorwindow.h:39
StateSlr
Definition slrtutorwindow.h:33
@ H_prime
Definition slrtutorwindow.h:55
@ A4
Definition slrtutorwindow.h:38
@ E
Definition slrtutorwindow.h:48
@ CA
Definition slrtutorwindow.h:42
@ E1
Definition slrtutorwindow.h:49
@ D1
Definition slrtutorwindow.h:45
@ E2
Definition slrtutorwindow.h:50
@ A3
Definition slrtutorwindow.h:37
@ D_prime
Definition slrtutorwindow.h:47
@ F
Definition slrtutorwindow.h:51
@ CB
Definition slrtutorwindow.h:43
@ H
Definition slrtutorwindow.h:54
@ D2
Definition slrtutorwindow.h:46
@ FA
Definition slrtutorwindow.h:52
@ G
Definition slrtutorwindow.h:53
@ D
Definition slrtutorwindow.h:44
Represents a context-free grammar, including its rules, symbol table, and starting symbol.
Definition grammar.hpp:27
Represents a state in the LR(0) automaton.
Definition state.hpp:16