blob: f65e78754f7458c407af3c9668a05f9ab2e8589b [file] [log] [blame]
swissChilic71acc62021-12-07 08:03:37 -08001#pragma once
2
3#include <QString>
4
swissChili682e7bc2021-12-07 09:04:54 -08005#include "Token.h"
swissChilic71acc62021-12-07 08:03:37 -08006#include "AstNode.h"
swissChili8a581c62021-12-07 13:29:21 -08007#include "Function.h"
swissChilic71acc62021-12-07 08:03:37 -08008
swissChili847a78c2021-12-09 17:44:52 -08009struct ParsePos
10{
11 int line = 0,
12 pos = 0,
13 lineOffset = 0;
14};
15
16class ParseResult
17{
18public:
19 ParseResult() = default;
20 ParseResult(bool okay);
21 explicit ParseResult(int status, ParsePos pos = {});
22 ParseResult(int status, QString message, ParsePos pos = {});
23
24 enum
25 {
26 NO_MATCH,
27 COMPLETE,
28 INCOMPLETE,
29 };
30
31 operator bool() const;
32
33 ParsePos pos() const;
34 QString message() const;
35 int status() const;
36
37private:
38 int _status = COMPLETE;
39 QString _message = "";
40 ParsePos _pos;
41};
42
swissChilic71acc62021-12-07 08:03:37 -080043class Parser
44{
45public:
46 explicit Parser(QString input);
47
48 QChar peek();
49 QChar get();
50 bool atEnd();
51
52 void skip();
53
swissChili682e7bc2021-12-07 09:04:54 -080054 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080055 ParseResult parseSymbol(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080056
57 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080058 ParseResult parseIdentifier(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080059
60 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080061 ParseResult parseNumber(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080062
63 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080064 ParseResult parseVariable(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080065
66 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080067 ParseResult parseParens(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080068
swissChili847a78c2021-12-09 17:44:52 -080069 ParseResult parseFunction(AstNode *node);
swissChili682e7bc2021-12-07 09:04:54 -080070
71 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080072 ParseResult parseMany(QList<T> *list);
swissChili682e7bc2021-12-07 09:04:54 -080073
74 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080075 ParseResult parseOne(T *node);
swissChilic71acc62021-12-07 08:03:37 -080076
swissChili847a78c2021-12-09 17:44:52 -080077 ParseResult parseSentence(Sentence *sentence);
78 ParseResult parseFunctionDefinition(Function *function);
79
80 ParsePos save() const;
81 void reset(ParsePos pos);
swissChili8a581c62021-12-07 13:29:21 -080082
swissChilic71acc62021-12-07 08:03:37 -080083private:
84 int _pos = 0;
swissChili847a78c2021-12-09 17:44:52 -080085 int _line = 1;
86 int _offset = 1;
87
swissChilic71acc62021-12-07 08:03:37 -080088 QString _input;
89};
swissChili682e7bc2021-12-07 09:04:54 -080090
91template <>
swissChili847a78c2021-12-09 17:44:52 -080092ParseResult Parser::parseOne<Token>(Token *node);
swissChili682e7bc2021-12-07 09:04:54 -080093
94template <>
swissChili847a78c2021-12-09 17:44:52 -080095ParseResult Parser::parseOne<AstNode>(AstNode *node);