-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathvisitormath.cpp
More file actions
100 lines (88 loc) · 2.64 KB
/
visitormath.cpp
File metadata and controls
100 lines (88 loc) · 2.64 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
#include "visitormath.h"
VisitorMath::VisitorMath() :edit(nullptr){}
void VisitorMath::setWidgetDebug(QTextEdit *out)
{
edit=out;
}
antlrcpp::Any VisitorMath::visitProg(MathParser::ProgContext *context) {
for (auto m : context->stat()) {
visit(m);
}
QString msg;
msg.append(QObject::tr("\nresult %1").arg (value.value.toString()));
for (const std::pair<std::string, QVariant> &vars : value.globalvars) {
msg.append(QObject::tr("\nglobal id %1 it's val is %2").arg (QString::fromStdString (vars.first)).arg (vars.second.toString()));
}
edit->append (msg) ;
return nullptr;
}
antlrcpp::Any VisitorMath::visitBaseExpr(MathParser::BaseExprContext *context) {
visit(context->expr());
return nullptr;
}
antlrcpp::Any VisitorMath::visitSetVariable(
MathParser::SetVariableContext *context) {
visit(context->expr());
value.globalvars[context->ID()->getText()] = value.value;
return nullptr;
}
antlrcpp::Any VisitorMath::visitInteger(MathParser::IntegerContext *context) {
auto str = QString::fromStdString(context->INT()->getText());
tmpVal = context->MIN () ? -str.toInt (): str.toInt();
return nullptr;
}
antlrcpp::Any VisitorMath::visitVariable(MathParser::VariableContext *context) {
auto s = value.globalvars.find(context->ID()->getText());
if (s != value.globalvars.end()) {
tmpVal = s->second;
} else {
QString msg;
msg.append (QObject::tr ("\nwarning not found id var %1").arg (context->ID()->getText().c_str()));
edit->append (msg) ;
}
return nullptr;
}
antlrcpp::Any VisitorMath::visitAritLondo(
MathParser::AritLondoContext *context) {
visit(context->expr().at(0));
auto left = tmpVal.toInt();
visit(context->expr().at(1));
auto right = tmpVal.toInt();
if (context->op->getText() == "+") {
auto ret = (int)left + right;
value.value=ret;
tmpVal=ret;
} else {
auto ret = (int)left - right;
value.value=ret;
tmpVal=ret;
}
return nullptr;
}
antlrcpp::Any VisitorMath::visitAritPipo(MathParser::AritPipoContext *context) {
visit(context->expr().at(0));
auto left = tmpVal.toInt();
visit(context->expr().at(1));
auto right = tmpVal.toInt();
if (context->op->getText() == "*") {
auto ret = (int)left * right;
value.value=ret;
tmpVal=ret;
} else {
if (right == 0) {
QString msg;
msg.append (QObject::tr ("\ncannot divide by 0!"));
edit->append (msg);
return nullptr;
}
auto ret = (int)left / right;
value.value=ret;
tmpVal=ret;
}
return nullptr;
}
antlrcpp::Any VisitorMath::visitArithBraches(
MathParser::ArithBrachesContext *context) {
visit(context->expr());
return nullptr;
}