swissChili | c71acc6 | 2021-12-07 08:03:37 -0800 | [diff] [blame] | 1 | #pragma once |
2 | |||||
3 | #include <QString> | ||||
4 | |||||
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 5 | #include "Token.h" |
swissChili | c71acc6 | 2021-12-07 08:03:37 -0800 | [diff] [blame] | 6 | #include "AstNode.h" |
swissChili | 8a581c6 | 2021-12-07 13:29:21 -0800 | [diff] [blame] | 7 | #include "Function.h" |
swissChili | c71acc6 | 2021-12-07 08:03:37 -0800 | [diff] [blame] | 8 | |
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 9 | struct ParsePos |
10 | { | ||||
11 | int line = 0, | ||||
12 | pos = 0, | ||||
13 | lineOffset = 0; | ||||
14 | }; | ||||
15 | |||||
16 | class ParseResult | ||||
17 | { | ||||
18 | public: | ||||
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 | |||||
37 | private: | ||||
38 | int _status = COMPLETE; | ||||
39 | QString _message = ""; | ||||
40 | ParsePos _pos; | ||||
41 | }; | ||||
42 | |||||
swissChili | c71acc6 | 2021-12-07 08:03:37 -0800 | [diff] [blame] | 43 | class Parser |
44 | { | ||||
45 | public: | ||||
46 | explicit Parser(QString input); | ||||
47 | |||||
48 | QChar peek(); | ||||
49 | QChar get(); | ||||
50 | bool atEnd(); | ||||
51 | |||||
52 | void skip(); | ||||
53 | |||||
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 54 | template <typename T> |
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 55 | ParseResult parseSymbol(T *node); |
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 56 | |
57 | template <typename T> | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 58 | ParseResult parseIdentifier(T *node); |
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 59 | |
60 | template <typename T> | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 61 | ParseResult parseNumber(T *node); |
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 62 | |
63 | template <typename T> | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 64 | ParseResult parseVariable(T *node); |
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 65 | |
66 | template <typename T> | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 67 | ParseResult parseParens(T *node); |
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 68 | |
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 69 | ParseResult parseFunction(AstNode *node); |
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 70 | |
71 | template <typename T> | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 72 | ParseResult parseMany(QList<T> *list); |
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 73 | |
74 | template <typename T> | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 75 | ParseResult parseOne(T *node); |
swissChili | c71acc6 | 2021-12-07 08:03:37 -0800 | [diff] [blame] | 76 | |
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 77 | ParseResult parseSentence(Sentence *sentence); |
78 | ParseResult parseFunctionDefinition(Function *function); | ||||
79 | |||||
80 | ParsePos save() const; | ||||
81 | void reset(ParsePos pos); | ||||
swissChili | 8a581c6 | 2021-12-07 13:29:21 -0800 | [diff] [blame] | 82 | |
swissChili | c71acc6 | 2021-12-07 08:03:37 -0800 | [diff] [blame] | 83 | private: |
84 | int _pos = 0; | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 85 | int _line = 1; |
86 | int _offset = 1; | ||||
87 | |||||
swissChili | c71acc6 | 2021-12-07 08:03:37 -0800 | [diff] [blame] | 88 | QString _input; |
89 | }; | ||||
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 90 | |
91 | template <> | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 92 | ParseResult Parser::parseOne<Token>(Token *node); |
swissChili | 682e7bc | 2021-12-07 09:04:54 -0800 | [diff] [blame] | 93 | |
94 | template <> | ||||
swissChili | 847a78c | 2021-12-09 17:44:52 -0800 | [diff] [blame^] | 95 | ParseResult Parser::parseOne<AstNode>(AstNode *node); |