SyntaxTutor
Educational app designed to help compiler students understand LL(1) and SLR(1) parsing algorithms.
 
Loading...
Searching...
No Matches
lltutorwindow.h
Go to the documentation of this file.
1#ifndef LLTUTORWINDOW_H
2#define LLTUTORWINDOW_H
3
4#include <QAbstractItemView>
5#include <QDialog>
6#include <QFileDialog>
7#include <QGraphicsColorizeEffect>
8#include <QGraphicsScene>
9#include <QGraphicsTextItem>
10#include <QGraphicsView>
11#include <QListWidgetItem>
12#include <QMainWindow>
13#include <QMessageBox>
14#include <QPainter>
15#include <QPropertyAnimation>
16#include <QPushButton>
17#include <QScrollBar>
18#include <QShortcut>
19#include <QTableWidget>
20#include <QTextDocument>
21#include <QTextEdit>
22#include <QTime>
23#include <QTimer>
24#include <QTreeWidgetItem>
25#include <QVBoxLayout>
26#include <QtPrintSupport/QPrinter>
27
28#include "backend/grammar.hpp"
30#include "lltabledialog.h"
31
32class TutorialManager;
33
34namespace Ui {
35class LLTutorWindow;
36}
37
38// ====== LL(1) Tutor States ===================================
39enum class State { A, A1, A2, A_prime, B, B1, B2, B_prime, C, C_prime, fin };
40
41// ====== LL(1) Tutor Main Class ===============================
60class LLTutorWindow : public QMainWindow
61{
62 Q_OBJECT
63
64public:
65 // ====== Derivation Tree (used in TeachFirst) =============
69 struct TreeNode
70 {
71 QString label;
72 std::vector<std::unique_ptr<TreeNode>> children;
73 };
74
75 // ====== Constructor / Destructor =========================
82 explicit LLTutorWindow(const Grammar &grammar,
83 TutorialManager *tm = nullptr,
84 QWidget *parent = nullptr);
86
87 // ====== State Machine & Question Logic ====================
92 QString generateQuestion();
93
98 void updateState(bool isCorrect);
99
105 QString FormatGrammar(const Grammar &grammar);
106
107 // ====== UI Interaction ====================================
108 void addMessage(const QString &text, bool isUser);
109 void addWidgetMessage(QWidget *widget);
110 void exportConversationToPdf(const QString &filePath);
111 void showTable();
112 void showTableForCPrime();
113 void updateProgressPanel(); // Update progress panel
114
115 // ====== Visual Feedback / Animations ======================
116 void animateLabelPop(QLabel *label);
117 void animateLabelColor(QLabel *label, const QColor &flashColor);
118 void wrongAnimation();
120 void markLastUserIncorrect();
121
122 // ====== Tree Generation (TeachFirst mode) =================
123 void TeachFirstTree(const std::vector<std::string> &symbols,
124 std::unordered_set<std::string> &first_set,
125 int depth,
126 std::unordered_set<std::string> &processing,
127 QTreeWidgetItem *parent);
128
129 std::unique_ptr<TreeNode> buildTreeNode(
130 const std::vector<std::string> &symbols,
131 std::unordered_set<std::string> &first_set,
132 int depth,
133 std::vector<std::pair<std::string, std::vector<std::string>>> &active_derivations);
134
135 int computeSubtreeWidth(const std::unique_ptr<TreeNode> &node, int hSpacing);
136 void drawTree(const std::unique_ptr<TreeNode> &root,
137 QGraphicsScene *scene,
138 QPointF pos,
139 int hSpacing,
140 int vSpacing);
141
142 void showTreeGraphics(std::unique_ptr<TreeNode> root); // Display derivation tree visually
143
144 // ====== User Response Verification ========================
145 bool verifyResponse(const QString &userResponse); // Delegates to current state's verification
146 bool verifyResponseForA(const QString &userResponse);
147 bool verifyResponseForA1(const QString &userResponse);
148 bool verifyResponseForA2(const QString &userResponse);
149 bool verifyResponseForB(const QString &userResponse);
150 bool verifyResponseForB1(const QString &userResponse);
151 bool verifyResponseForB2(const QString &userResponse);
152 bool verifyResponseForC(); // C is non-textual (checks internal table)
153
154 // ====== Expected Solutions (Auto-generated) ===============
155 QString solution(const std::string &state);
156 QStringList solutionForA();
157 QString solutionForA1();
158 QString solutionForA2();
159 QSet<QString> solutionForB();
160 QSet<QString> solutionForB1();
161 QSet<QString> solutionForB2();
162
163 // ====== Feedback (Corrective Explanations) ================
164 QString feedback(); // Delegates by state
165 QString feedbackForA();
166 QString feedbackForA1();
167 QString feedbackForA2();
168 QString feedbackForAPrime();
169 QString feedbackForB();
170 QString feedbackForB1();
171 QString feedbackForB2();
172 QString feedbackForBPrime();
173 QString feedbackForC();
174 QString feedbackForCPrime();
175 void feedbackForB1TreeWidget(); // TreeWidget of Teach (LL1 TeachFirst)
176 void feedbackForB1TreeGraphics(); // Show derivation tree
177 QString TeachFollow(const QString &nt);
178 QString TeachPredictionSymbols(const QString &ant, const production &conseq);
179 QString TeachLL1Table();
180
181 void handleTableSubmission(const QVector<QVector<QString>> &raw, const QStringList &colHeaders);
182private slots:
183 void on_confirmButton_clicked();
184 void on_userResponse_textChanged();
185
186signals:
187 void sessionFinished(int cntRight, int cntWrong);
188
189protected:
190 void closeEvent(QCloseEvent *event) override
191 {
192 emit sessionFinished(cntRightAnswers, cntWrongAnswers);
193 QWidget::closeEvent(event);
194 }
195
196 bool eventFilter(QObject *obj, QEvent *event) override;
197
198private:
199 // ====== Core Objects ======================================
200 Ui::LLTutorWindow *ui;
201 Grammar grammar;
202 LL1Parser ll1;
203
204 // ====== State & Grammar Tracking ==========================
205 State currentState;
206 size_t currentRule = 0;
207 const unsigned kMaxHighlightTries = 3;
208 const unsigned kMaxTotalTries = 5;
209 unsigned lltries = 0;
210 unsigned cntRightAnswers = 0, cntWrongAnswers = 0;
211
212 using Cell = std::pair<QString, QString>;
213 std::vector<Cell> lastWrongCells;
214 LLTableDialog *currentDlg = nullptr;
215
216 QVector<QString> sortedNonTerminals;
217 QVector<QPair<QString, QVector<QString>>> sortedGrammar;
218 QString formattedGrammar;
219
220 QMap<QString, QMap<QString, QVector<QString>>> lltable;
221 QVector<QVector<QString>> rawTable;
222 QSet<QString> solutionSet;
223
224 // ====== Conversation Logging ==============================
225 struct MessageLog
226 {
227 QString message;
228 bool isUser;
229 bool isCorrect = true;
230 MessageLog(const QString &message, bool isUser)
231 : message(message)
232 , isUser(isUser)
233 {}
234 void toggleIsCorrect() { isCorrect = false; }
235 };
236
237 QVector<MessageLog> conversationLog;
238 QWidget *lastUserMessage = nullptr;
239 qsizetype lastUserMessageLogIdx = -1;
240
241 QMap<QString, QString> userCAB;
242 QMap<QString, QString> userSIG;
243 QMap<QString, QString> userSD;
244
245 // ====== Helper Conversions ================================
246 std::vector<std::string> qvectorToStdVector(const QVector<QString> &qvec);
247 QVector<QString> stdVectorToQVector(const std::vector<std::string> &vec);
248 QSet<QString> stdUnorderedSetToQSet(const std::unordered_set<std::string> &uset);
249 std::unordered_set<std::string> qsetToStdUnorderedSet(const QSet<QString> &qset);
250
251 void setupTutorial();
252
253 void fillSortedGrammar(); // Populate sortedGrammar from internal representation
254
255 QPropertyAnimation *m_shakeAnimation
256 = nullptr; // For interrupting userResponse animation if they spam enter key
257
258 TutorialManager *tm = nullptr;
259
260 QRegularExpression re{"^\\s+|\\s+$"};
261};
262
263#endif // LLTUTORWINDOW_H
Definition ll1_parser.hpp:10
Dialog for filling and submitting an LL(1) parsing table.
Definition lltabledialog.h:23
void wrongAnimation()
Visual shake/flash for incorrect answer.
Definition lltutorwindow.cpp:791
QString feedbackForCPrime()
Definition lltutorwindow.cpp:1722
void showTableForCPrime()
Display the full LL(1) table in C' ex.
Definition lltutorwindow.cpp:437
void wrongUserResponseAnimation()
Animation specific to user chat input.
Definition lltutorwindow.cpp:823
void sessionFinished(int cntRight, int cntWrong)
QString TeachLL1Table()
Definition lltutorwindow.cpp:2408
~LLTutorWindow()
Definition lltutorwindow.cpp:81
void showTreeGraphics(std::unique_ptr< TreeNode > root)
Definition lltutorwindow.cpp:2178
void markLastUserIncorrect()
Marks last message as incorrect.
Definition lltutorwindow.cpp:918
void animateLabelColor(QLabel *label, const QColor &flashColor)
Definition lltutorwindow.cpp:888
void drawTree(const std::unique_ptr< TreeNode > &root, QGraphicsScene *scene, QPointF pos, int hSpacing, int vSpacing)
Definition lltutorwindow.cpp:2093
bool verifyResponseForB(const QString &userResponse)
Definition lltutorwindow.cpp:1277
QString feedbackForA2()
Definition lltutorwindow.cpp:1510
LLTutorWindow(const Grammar &grammar, TutorialManager *tm=nullptr, QWidget *parent=nullptr)
Constructs the LL(1) tutor window with a given grammar.
Definition lltutorwindow.cpp:9
void showTable()
< Export chat to PDF
Definition lltutorwindow.cpp:599
void feedbackForB1TreeGraphics()
Definition lltutorwindow.cpp:1587
QString solutionForA1()
Definition lltutorwindow.cpp:1362
bool verifyResponseForA1(const QString &userResponse)
Definition lltutorwindow.cpp:1269
QString feedbackForB2()
Definition lltutorwindow.cpp:1634
QString feedbackForB1()
Definition lltutorwindow.cpp:1599
bool verifyResponseForC()
Definition lltutorwindow.cpp:1307
void closeEvent(QCloseEvent *event) override
Definition lltutorwindow.h:190
void addWidgetMessage(QWidget *widget)
< Add text message to chat
Definition lltutorwindow.cpp:1726
QString solution(const std::string &state)
QString feedbackForA1()
Definition lltutorwindow.cpp:1500
bool verifyResponseForB1(const QString &userResponse)
Definition lltutorwindow.cpp:1287
bool verifyResponse(const QString &userResponse)
Definition lltutorwindow.cpp:1231
QString TeachPredictionSymbols(const QString &ant, const production &conseq)
Definition lltutorwindow.cpp:2336
QString feedbackForAPrime()
Definition lltutorwindow.cpp:1536
void handleTableSubmission(const QVector< QVector< QString > > &raw, const QStringList &colHeaders)
Definition lltutorwindow.cpp:737
QString feedbackForA()
Definition lltutorwindow.cpp:1457
bool verifyResponseForA2(const QString &userResponse)
Definition lltutorwindow.cpp:1273
void updateState(bool isCorrect)
Updates the tutor state after verifying user response.
Definition lltutorwindow.cpp:1130
QString solutionForA2()
Definition lltutorwindow.cpp:1368
QSet< QString > solutionForB1()
Definition lltutorwindow.cpp:1385
QString feedback()
Definition lltutorwindow.cpp:1422
int computeSubtreeWidth(const std::unique_ptr< TreeNode > &node, int hSpacing)
Definition lltutorwindow.cpp:2081
QString TeachFollow(const QString &nt)
Definition lltutorwindow.cpp:2199
QStringList solutionForA()
Definition lltutorwindow.cpp:1354
void TeachFirstTree(const std::vector< std::string > &symbols, std::unordered_set< std::string > &first_set, int depth, std::unordered_set< std::string > &processing, QTreeWidgetItem *parent)
Definition lltutorwindow.cpp:1937
QString feedbackForC()
Definition lltutorwindow.cpp:1713
QSet< QString > solutionForB2()
Definition lltutorwindow.cpp:1408
QString FormatGrammar(const Grammar &grammar)
Formats a grammar for display in the chat interface.
Definition lltutorwindow.cpp:1786
void animateLabelPop(QLabel *label)
Definition lltutorwindow.cpp:853
bool verifyResponseForB2(const QString &userResponse)
Definition lltutorwindow.cpp:1297
QString feedbackForB()
Definition lltutorwindow.cpp:1546
bool verifyResponseForA(const QString &userResponse)
Definition lltutorwindow.cpp:1264
QString feedbackForBPrime()
Definition lltutorwindow.cpp:1674
std::unique_ptr< TreeNode > buildTreeNode(const std::vector< std::string > &symbols, std::unordered_set< std::string > &first_set, int depth, std::vector< std::pair< std::string, std::vector< std::string > > > &active_derivations)
Definition lltutorwindow.cpp:2009
void exportConversationToPdf(const QString &filePath)
< Add widget (e.g., table, tree)
Definition lltutorwindow.cpp:85
void addMessage(const QString &text, bool isUser)
Definition lltutorwindow.cpp:311
void updateProgressPanel()
Definition lltutorwindow.cpp:270
QSet< QString > solutionForB()
Definition lltutorwindow.cpp:1377
bool eventFilter(QObject *obj, QEvent *event) override
Definition lltutorwindow.cpp:2139
void feedbackForB1TreeWidget()
Definition lltutorwindow.cpp:1733
QString generateQuestion()
Generates a question for the current state of the tutor.
Definition lltutorwindow.cpp:1050
Manages interactive tutorials by highlighting UI elements and guiding the user.
Definition tutorialmanager.h:35
std::vector< std::string > production
Represents the right-hand side of a grammar rule.
Definition grammar.hpp:17
State
Definition lltutorwindow.h:39
@ C
Definition lltutorwindow.h:39
@ A1
Definition lltutorwindow.h:39
@ A
Definition lltutorwindow.h:39
@ B
Definition lltutorwindow.h:39
@ C_prime
Definition lltutorwindow.h:39
@ B2
Definition lltutorwindow.h:39
@ B_prime
Definition lltutorwindow.h:39
@ A2
Definition lltutorwindow.h:39
@ B1
Definition lltutorwindow.h:39
@ fin
Definition lltutorwindow.h:39
@ A_prime
Definition lltutorwindow.h:39
Represents a context-free grammar, including its rules, symbol table, and starting symbol.
Definition grammar.hpp:27
TreeNode structure used to build derivation trees.
Definition lltutorwindow.h:70
std::vector< std::unique_ptr< TreeNode > > children
Definition lltutorwindow.h:72
QString label
Definition lltutorwindow.h:71
Represents a state in the LR(0) automaton.
Definition state.hpp:16