botanist  v0.1.0
Loading...
Searching...
No Matches
analyser.hpp
Go to the documentation of this file.
1
4
5#ifndef BOTANIST_ANALYSER_H
6#define BOTANIST_ANALYSER_H
7
8#include <collection2/list.hpp>
9#include <collection2/tree.hpp>
10
11#include "syntaxnode.hpp"
12#include "token.hpp"
13
14namespace botanist {
15
17class Analyser final {
18 private:
20 const collection2::List<Token>& tokenList;
21
23 collection2::Node<Token>* currentTokenNode = nullptr;
24
26 collection2::Tree<SyntaxNode>& syntaxNodeTree;
27
29 size_t tokenIndex = 0;
30
32 collection2::TreeNode<SyntaxNode>* root = nullptr;
33
44 collection2::TreeNode<SyntaxNode>* createNewNode(
45 const SyntaxNode::Kind kind,
46 collection2::TreeNode<SyntaxNode>* lhs = nullptr,
47 collection2::TreeNode<SyntaxNode>* rhs = nullptr);
48
55 bool expect(const Token::Kind kind) const;
56
67 bool expect(const char* content, const size_t length = 1) const;
68
75 bool forward(const Token::Kind kind);
76
87 bool forward(const char* content, const size_t length = 1);
88
92 void advanceTokenList() {
93 if (currentTokenNode == nullptr) {
94 return;
95 }
96 currentTokenNode = currentTokenNode->next;
97 tokenIndex++;
98 }
99
103 void initializeNodePool() {
104 syntaxNodeTree.initializeTreeNodePool();
105 root = nullptr;
106 }
107
113 collection2::TreeNode<SyntaxNode>* expression();
114
120 collection2::TreeNode<SyntaxNode>* unary();
121
127 collection2::TreeNode<SyntaxNode>* factor();
128
129 public:
130 explicit Analyser(
131 const collection2::List<Token>& tokenList,
132 collection2::Tree<SyntaxNode>& syntaxNodeTree)
133 : tokenList(tokenList), syntaxNodeTree(syntaxNodeTree){};
134
141 size_t analyse();
142
149 collection2::TreeNode<SyntaxNode>* rootNode() {
150 return root;
151 }
152
153#ifndef HEADLESS
154
159 void dumpSyntaxTree() const;
160
166 void dumpSyntaxNode(collection2::TreeNode<botanist::SyntaxNode>* nodePtr) const;
167
168#else
169 void dumpSyntaxTree() const = delete;
170 void dumpSyntaxNode(collection2::TreeNode<botanist::SyntaxNode>* nodePtr) const = delete;
171#endif
172};
173
174} // namespace botanist
175
176#endif /* BOTANIST_ANALYSER_H */
トークナイズされた数式を解析し、構文木を形成する
Definition: analyser.hpp:17
size_t analyse()
トークナイズされた数式から構文木を生成
void dumpSyntaxNode(collection2::TreeNode< botanist::SyntaxNode > *nodePtr) const
構文ノードをダンプ
collection2::TreeNode< SyntaxNode > * rootNode()
構文木のルートノードを取得
Definition: analyser.hpp:149
void dumpSyntaxTree() const
構文木をダンプ
Kind
ノードの種類
Definition: syntaxnode.hpp:17
Kind
トークンの種類
Definition: token.hpp:16
数式トークン