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