blob: ee604f9fb53ff239931bcd34bd453c14a53cb6f4 [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
swissChili2506b922022-02-15 21:07:20 -080037 ParseResult operator ||(const ParseResult &other) const;
38
swissChili847a78c2021-12-09 17:44:52 -080039private:
40 int _status = COMPLETE;
41 QString _message = "";
42 ParsePos _pos;
43};
44
swissChilic71acc62021-12-07 08:03:37 -080045class Parser
46{
47public:
48 explicit Parser(QString input);
49
50 QChar peek();
51 QChar get();
52 bool atEnd();
53
54 void skip();
55
swissChili682e7bc2021-12-07 09:04:54 -080056 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080057 ParseResult parseSymbol(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080058
59 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080060 ParseResult parseIdentifier(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080061
62 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080063 ParseResult parseNumber(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080064
65 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080066 ParseResult parseVariable(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080067
68 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080069 ParseResult parseParens(T *node);
swissChili682e7bc2021-12-07 09:04:54 -080070
swissChili847a78c2021-12-09 17:44:52 -080071 ParseResult parseFunction(AstNode *node);
swissChili682e7bc2021-12-07 09:04:54 -080072
73 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080074 ParseResult parseMany(QList<T> *list);
swissChili682e7bc2021-12-07 09:04:54 -080075
76 template <typename T>
swissChili847a78c2021-12-09 17:44:52 -080077 ParseResult parseOne(T *node);
swissChilic71acc62021-12-07 08:03:37 -080078
swissChili847a78c2021-12-09 17:44:52 -080079 ParseResult parseSentence(Sentence *sentence);
80 ParseResult parseFunctionDefinition(Function *function);
81
82 ParsePos save() const;
83 void reset(ParsePos pos);
swissChili8a581c62021-12-07 13:29:21 -080084
swissChilic71acc62021-12-07 08:03:37 -080085private:
86 int _pos = 0;
swissChili847a78c2021-12-09 17:44:52 -080087 int _line = 1;
88 int _offset = 1;
89
swissChilic71acc62021-12-07 08:03:37 -080090 QString _input;
91};
swissChili682e7bc2021-12-07 09:04:54 -080092
93template <>
swissChili847a78c2021-12-09 17:44:52 -080094ParseResult Parser::parseOne<Token>(Token *node);
swissChili682e7bc2021-12-07 09:04:54 -080095
96template <>
swissChili847a78c2021-12-09 17:44:52 -080097ParseResult Parser::parseOne<AstNode>(AstNode *node);