-
Notifications
You must be signed in to change notification settings - Fork 0
/
Function.cpp
122 lines (98 loc) · 1.95 KB
/
Function.cpp
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "Function.h"
#include "Parser.h"
#include <QDebug>
template <typename T>
QString join(QList<T> list, QString sep)
{
QStringList strings;
for (const T &item : list)
{
strings.append(static_cast<QString>(item));
}
return strings.join(sep);
}
Sentence::~Sentence()
{
}
Sentence::Sentence(QList<Token> pattern, QList<AstNode> result)
{
_pattern = pattern;
_result = result;
}
Sentence::Sentence(QList<Token> pattern, SentenceResultFn result)
{
_pattern = pattern;
_native = result;
}
bool Sentence::isExternal() const
{
return _native != nullptr;
}
QList<Token> Sentence::externResult(MatchResult args) const
{
return _native(args.context);
}
QList<Token> Sentence::pattern() const
{
return _pattern;
}
QList<AstNode> Sentence::result() const
{
return _result;
}
Sentence::operator QString() const
{
return join(_pattern, " ") + " = " + join(_result, " ") + ";";
}
Function::Function(QString name)
: Function(name, {})
{
}
Function::Function(QString name, QList<Sentence> sentences)
{
_name = name;
_sentences = sentences;
}
void Function::addSentence(Sentence sentence)
{
_sentences.append(sentence);
}
void Function::addNativeSentence(QString pattern, SentenceResultFn fn)
{
Parser parser(std::move(pattern));
QList<Token> parsedPattern;
ParseResult res = parser.parseMany(&parsedPattern);
if (!res)
{
qDebug() << "Failed to parse pattern for native sentence";
qDebug() << res.message();
}
else
{
addSentence(Sentence(parsedPattern, std::move(fn)));
}
}
QString Function::name() const
{
return _name;
}
QList<Sentence> Function::sentences() const
{
return _sentences;
}
Function::operator QString() const
{
QString buffer = name() + " { ";
int leftPadding = buffer.length();
QString spaces;
for (int i = 0; i < leftPadding; i++)
spaces += " ";
for (int i = 0; i < _sentences.length(); i++)
{
if (i)
buffer += "\n" + spaces;
buffer += static_cast<QString>(_sentences[i]);
}
buffer += " }";
return buffer;
}