Line data Source code
1 : #include "../../../../inc/parsingAnalysis/algorithm/topDown.h"
2 :
3 : namespace nicole {
4 :
5 : const std::expected<std::shared_ptr<AST>, Error>
6 0 : TopDown::parseOr() const noexcept {
7 0 : const auto firsToken{tkStream_.current()};
8 0 : std::expected<std::shared_ptr<AST>, Error> left{parseAnd()};
9 :
10 0 : if (!left || !*left) {
11 0 : return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
12 0 : : left.error()};
13 0 : }
14 :
15 0 : while (tkStream_.currentPos() < tkStream_.size() &&
16 0 : (tkStream_.current()->type() == TokenType::OR)) {
17 0 : const Token token{*tkStream_.current()};
18 0 : std::expected<std::monostate, Error> eaten{tkStream_.eat()};
19 0 : if (!eaten) {
20 0 : return std::unexpected{
21 0 : Error{ERROR_TYPE::SINTAX,
22 0 : "failed to eat " + token.raw() + " at " + token.locInfo()}};
23 0 : }
24 :
25 0 : const std::expected<std::shared_ptr<AST>, Error> right{parseAnd()};
26 0 : if (!right || !*right) {
27 0 : return std::unexpected{right
28 0 : ? Error{ERROR_TYPE::NULL_NODE,
29 0 : "right is null at " + token.locInfo()}
30 0 : : right.error()};
31 0 : }
32 :
33 0 : left =
34 0 : Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
35 0 : token, *left, *right);
36 0 : if (!left) {
37 0 : return std::unexpected{left.error()};
38 0 : }
39 0 : }
40 :
41 0 : return left;
42 0 : }
43 :
44 : const std::expected<std::shared_ptr<AST>, Error>
45 0 : TopDown::parseAnd() const noexcept {
46 0 : const auto firsToken{tkStream_.current()};
47 0 : std::expected<std::shared_ptr<AST>, Error> left{parseEqual_NotEqual()};
48 :
49 0 : if (!left || !*left) {
50 0 : return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
51 0 : : left.error()};
52 0 : }
53 :
54 0 : while (tkStream_.currentPos() < tkStream_.size() &&
55 0 : (tkStream_.current()->type() == TokenType::AND)) {
56 0 : const Token token{*tkStream_.current()};
57 0 : std::expected<std::monostate, Error> eaten{tkStream_.eat()};
58 0 : if (!eaten) {
59 0 : return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
60 0 : " at " + token.locInfo());
61 0 : }
62 :
63 0 : const std::expected<std::shared_ptr<AST>, Error> right{
64 0 : parseEqual_NotEqual()};
65 0 : if (!right || !*right) {
66 0 : return std::unexpected{right
67 0 : ? Error{ERROR_TYPE::NULL_NODE,
68 0 : "right is null at " + token.locInfo()}
69 0 : : right.error()};
70 0 : }
71 :
72 0 : left =
73 0 : Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
74 0 : token, *left, *right);
75 0 : if (!left) {
76 0 : return createError(left.error());
77 0 : }
78 0 : }
79 :
80 0 : return left;
81 0 : }
82 :
83 : const std::expected<std::shared_ptr<AST>, Error>
84 0 : TopDown::parseEqual_NotEqual() const noexcept {
85 0 : const auto firsToken{tkStream_.current()};
86 0 : std::expected<std::shared_ptr<AST>, Error> left{parseCompare()};
87 :
88 0 : if (!left || !*left) {
89 0 : return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
90 0 : : left.error()};
91 0 : }
92 :
93 0 : while (tkStream_.currentPos() < tkStream_.size() &&
94 0 : (tkStream_.current()->type() == TokenType::EQUAL ||
95 0 : tkStream_.current()->type() == TokenType::NOTEQUAL)) {
96 0 : const Token token{*tkStream_.current()};
97 0 : std::expected<std::monostate, Error> eaten{tkStream_.eat()};
98 0 : if (!eaten) {
99 0 : return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
100 0 : " at " + token.locInfo());
101 0 : }
102 :
103 0 : const std::expected<std::shared_ptr<AST>, Error> right{parseCompare()};
104 0 : if (!right || !*right) {
105 0 : return std::unexpected{right
106 0 : ? Error{ERROR_TYPE::NULL_NODE,
107 0 : "right is null at " + token.locInfo()}
108 0 : : right.error()};
109 0 : }
110 :
111 0 : left =
112 0 : Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
113 0 : token, *left, *right);
114 0 : if (!left) {
115 0 : return createError(left.error());
116 0 : }
117 0 : }
118 :
119 0 : return left;
120 0 : }
121 :
122 : const std::expected<std::shared_ptr<AST>, Error>
123 0 : TopDown::parseCompare() const noexcept {
124 0 : const auto firsToken{tkStream_.current()};
125 0 : std::expected<std::shared_ptr<AST>, Error> left{parseAdd_Sub()};
126 :
127 0 : if (!left || !*left) {
128 0 : return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
129 0 : : left.error()};
130 0 : }
131 :
132 0 : while (tkStream_.currentPos() < tkStream_.size() &&
133 0 : (tkStream_.current()->type() == TokenType::OPERATOR_SMALLER ||
134 0 : tkStream_.current()->type() == TokenType::SMALLEREQUAL ||
135 0 : tkStream_.current()->type() == TokenType::BIGGEREQUAL ||
136 0 : tkStream_.current()->type() == TokenType::BIGGEREQUAL)) {
137 0 : const Token token{*tkStream_.current()};
138 0 : std::expected<std::monostate, Error> eaten{tkStream_.eat()};
139 0 : if (!eaten) {
140 0 : return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
141 0 : " at " + token.locInfo());
142 0 : }
143 :
144 0 : const std::expected<std::shared_ptr<AST>, Error> right{parseAdd_Sub()};
145 0 : if (!right || !*right) {
146 0 : return std::unexpected{right
147 0 : ? Error{ERROR_TYPE::NULL_NODE,
148 0 : "right is null at " + token.locInfo()}
149 0 : : right.error()};
150 0 : }
151 :
152 0 : left =
153 0 : Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
154 0 : token, *left, *right);
155 0 : if (!left) {
156 0 : return createError(left.error());
157 0 : }
158 0 : }
159 :
160 0 : return left;
161 0 : }
162 :
163 : const std::expected<std::shared_ptr<AST>, Error>
164 0 : TopDown::parseAdd_Sub() const noexcept {
165 0 : const auto firsToken{tkStream_.current()};
166 0 : std::expected<std::shared_ptr<AST>, Error> left{parseMult_Div_Module()};
167 :
168 0 : if (!left || !*left) {
169 0 : return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
170 0 : : left.error()};
171 0 : }
172 :
173 0 : while (tkStream_.currentPos() < tkStream_.size() &&
174 0 : (tkStream_.current()->type() == TokenType::OPERATOR_ADD ||
175 0 : tkStream_.current()->type() == TokenType::OPERATOR_SUB)) {
176 0 : const Token token{*tkStream_.current()};
177 0 : std::expected<std::monostate, Error> eaten{tkStream_.eat()};
178 0 : if (!eaten) {
179 0 : return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
180 0 : " at " + token.locInfo());
181 0 : }
182 :
183 0 : const std::expected<std::shared_ptr<AST>, Error> right{
184 0 : parseMult_Div_Module()};
185 0 : if (!right || !*right) {
186 0 : return std::unexpected{right
187 0 : ? Error{ERROR_TYPE::NULL_NODE,
188 0 : "right is null at " + token.locInfo()}
189 0 : : right.error()};
190 0 : }
191 :
192 0 : left =
193 0 : Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
194 0 : token, *left, *right);
195 0 : if (!left) {
196 0 : return createError(left.error());
197 0 : }
198 0 : }
199 :
200 0 : return left;
201 0 : }
202 :
203 : const std::expected<std::shared_ptr<AST>, Error>
204 0 : TopDown::parseMult_Div_Module() const noexcept {
205 0 : const auto firsToken{tkStream_.current()};
206 0 : std::expected<std::shared_ptr<AST>, Error> left{parseFactor()};
207 :
208 0 : if (!left || !*left) {
209 0 : return std::unexpected{left ? Error{ERROR_TYPE::NULL_NODE, "left is null"}
210 0 : : left.error()};
211 0 : }
212 :
213 0 : while (tkStream_.currentPos() < tkStream_.size() &&
214 0 : (tkStream_.current()->type() == TokenType::OPERATOR_MULT ||
215 0 : tkStream_.current()->type() == TokenType::OPERATOR_DIV ||
216 0 : tkStream_.current()->type() == TokenType::OPERATOR_MODULE)) {
217 0 : const Token token{*tkStream_.current()};
218 0 : std::expected<std::monostate, Error> eaten{tkStream_.eat()};
219 0 : if (!eaten) {
220 0 : return createError(ERROR_TYPE::SINTAX, "failed to eat " + token.raw() +
221 0 : " at " + token.locInfo());
222 0 : }
223 :
224 0 : const std::expected<std::shared_ptr<AST>, Error> right{parseFactor()};
225 0 : if (!right || !*right) {
226 0 : return std::unexpected{right
227 0 : ? Error{ERROR_TYPE::NULL_NODE,
228 0 : "right is null at " + token.locInfo()}
229 0 : : right.error()};
230 0 : }
231 :
232 0 : left =
233 0 : Builder::createBinary(SourceLocation{*firsToken, *tkStream_.lastRead()},
234 0 : token, *left, *right);
235 0 : if (!left) {
236 0 : return createError(left.error());
237 0 : }
238 0 : }
239 :
240 0 : return left;
241 0 : }
242 :
243 : } // namespace nicole
|