blob: afda18f728c55db55f8dc97c8c00dd2a7289f187 [file] [log] [blame]
swissChili682e7bc2021-12-07 09:04:54 -08001#pragma once
2
swissChili07d325f2021-12-08 20:02:05 -08003#include <QMap>
swissChili918557c2022-02-20 20:16:34 -08004#include <QStack>
swissChili07d325f2021-12-08 20:02:05 -08005
6#include "Token.h"
7#include "AstNode.h"
8#include "Function.h"
9#include "VarContext.h"
10
11class RuntimeResult
12{
13public:
14 RuntimeResult(QList<Token> result);
15 RuntimeResult(QString message);
16
17 bool success() const;
18 QString message() const;
19 QList<Token> result() const;
20
21 operator QString() const;
22
23private:
24 bool _success = true;
25 QString _errorMessage;
26 QList<Token> _result;
27};
28
swissChili682e7bc2021-12-07 09:04:54 -080029class Evaluator {
30public:
swissChili323883d2022-02-20 16:35:23 -080031 Evaluator();
swissChili07d325f2021-12-08 20:02:05 -080032
33 void addFunction(Function func);
34 void clearFunction(QString name);
35 RuntimeResult evaluate(AstNode node, VarContext ctx);
36 RuntimeResult callFunction(QString name, QList<Token> args);
37
38private:
39 QMap<QString, Function> _functions;
swissChili918557c2022-02-20 20:16:34 -080040 QMap<QString, QStack<QList<Token>>> _vars;
41
42protected:
43 QList<Token> dig(QString name);
44 QList<Token> copy(QString name);
45 void bury(QString name, QList<Token> expression);
swissChili682e7bc2021-12-07 09:04:54 -080046};
swissChili918557c2022-02-20 20:16:34 -080047
48void rtError(QString brief, QString details);