-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMainWindow.cpp
More file actions
105 lines (84 loc) · 3.12 KB
/
Copy pathMainWindow.cpp
File metadata and controls
105 lines (84 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <QtWidgets/QPushButton>
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "Compiler.h"
#include "VM.h"
#include "ParserException.h"
#include "util.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QObject::connect(ui->compileButton,
&QPushButton::clicked,
this,
&MainWindow::onCompileClick);
varsModel = new QStandardItemModel(this);
ui->varsTableView->setModel(varsModel);
ui->statusbar->showMessage("Готово");
}
void MainWindow::onCompileClick() {
std::wstringstream codeStream;
std::wstring code = ui->codeEdit->document()->toPlainText().toStdWString();
codeStream << code;
try {
ui->statusbar->showMessage("Компиляция...");
Compiler compiler;
Program program = compiler.compile(codeStream);
ui->statusbar->showMessage("Компиляция завершена");
ui->statusbar->showMessage("Выполнение...");
VM vm;
auto vars = vm.execute(program);
varsModel->clear();
varsModel->setHorizontalHeaderLabels({"Переменная", "Значение"});
for (auto &var: vars) {
QStandardItem *varNameItem = new QStandardItem(
QString::fromStdWString(var.first));
QStandardItem *varValueItem = new QStandardItem(
QString::fromStdString(to_hex_str(var.second)));
varsModel->appendRow({varNameItem, varValueItem});
}
ui->varsTableView->repaint();
ui->varsTableView->resizeColumnsToContents();
ui->statusbar->showMessage("Выполнение завершёно успешно");
} catch (ParserExprException &e) {
varsModel->clear();
ui->varsTableView->repaint();
ui->statusbar->showMessage(
QString("Ошибка: ")
+ QString::fromStdWString(e.what()));
// select error-substring
auto endPos = e.getFrom();
auto startPos = e.getTo();
QTextCursor c = ui->codeEdit->textCursor();
c.setPosition(startPos);
c.setPosition(endPos, QTextCursor::KeepAnchor);
ui->codeEdit->setTextCursor(c);
ui->codeEdit->setFocus();
} catch (ParserException &e) {
varsModel->clear();
ui->varsTableView->repaint();
ui->statusbar->showMessage(
QString("Ошибка: ")
+ QString::fromStdWString(e.what()));
// select error-token
const Token &token = e.getToken();
auto endPos = token.pos;
auto startPos = endPos - token.value.size();
QTextCursor c = ui->codeEdit->textCursor();
c.setPosition(startPos);
c.setPosition(endPos, QTextCursor::KeepAnchor);
ui->codeEdit->setTextCursor(c);
ui->codeEdit->setFocus();
} catch (std::wstring &e) {
ui->statusbar->showMessage(
QString("Ошибка: ")
+ QString::fromStdWString(e));
}
}
MainWindow::~MainWindow()
{
delete ui;
}