1 #include "SolutionFile.hpp"
2 #include <soulng/util/Unicode.hpp>
3 #include <sngcm/cmlexer/ContainerFileLexer.hpp>
4 #include <sngcm/cmlexer/ContainerFileTokens.hpp>
5
6
7
8 using namespace soulng::unicode;
9 using namespace sngcm::ast;
10 using namespace ContainerFileTokens;
11
12 std::std::unique_ptr<sngcm::ast::Solution>SolutionFileParser::Parse(ContainerFileLexer&lexer)
13 {
14 std::unique_ptr<sngcm::ast::Solution> value;
15 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
16
17
18
19
20
21 #endif // SOULNG_PARSER_DEBUG_SUPPORT
22 ++lexer;
23 soulng::lexer::Span span = lexer.GetSpan();
24 soulng::parser::Match match = SolutionFileParser::SolutionFile(lexer);
25 value.reset(static_cast<sngcm::ast::Solution*>(match.value));
26 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
27
28
29
30
31
32 #endif // SOULNG_PARSER_DEBUG_SUPPORT
33 if (match.hit)
34 {
35 if (*lexer == soulng::lexer::END_TOKEN)
36 {
37 return value;
38 }
39 else
40 {
41 lexer.ThrowExpectationFailure(lexer.GetSpan(), ToUtf32(soulng::lexer::GetEndTokenInfo()));
42 }
43 }
44 else
45 {
46 lexer.ThrowExpectationFailure(span, U"SolutionFile");
47 }
48 return value;
49 }
50
51 soulng::parser::Match SolutionFileParser::SolutionFile(ContainerFileLexer& lexer)
52 {
53 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
54
55
56
57
58
59
60
61 #endif // SOULNG_PARSER_DEBUG_SUPPORT
62 std::unique_ptr<sngcm::ast::Solution> solution = std::unique_ptr<sngcm::ast::Solution>();
63 std::unique_ptr<soulng::parser::soulng::parser::Value<std::u32string>>name;
64 std::unique_ptr<sngcm::ast::SolutionDeclaration> declaration;
65 soulng::parser::Match match(false);
66 soulng::parser::Match* parentMatch0 = &match;
67 {
68 int64_t pos = lexer.GetPos();
69 soulng::parser::Match match(false);
70 soulng::parser::Match* parentMatch1 = &match;
71 {
72 soulng::parser::Match match(false);
73 soulng::parser::Match* parentMatch2 = &match;
74 {
75 soulng::parser::Match match(false);
76 soulng::parser::Match* parentMatch3 = &match;
77 {
78 soulng::parser::Match match(false);
79 soulng::parser::Match* parentMatch4 = &match;
80 {
81 soulng::parser::Match match(false);
82 if (*lexer == SOLUTION)
83 {
84 ++lexer;
85 match.hit = true;
86 }
87 *parentMatch4 = match;
88 }
89 if (match.hit)
90 {
91 soulng::parser::Match match(false);
92 soulng::parser::Match* parentMatch5 = &match;
93 {
94 soulng::parser::Match match(true);
95 soulng::parser::Match* parentMatch6 = &match;
96 {
97 soulng::lexer::Span span = lexer.GetSpan();
98 soulng::parser::Match match = SolutionFileParser::QualifiedId(lexer);
99 name.reset(static_cast<soulng::parser::soulng::parser::Value<std::u32string>*>(match.value));
100 if (match.hit)
101 {
102 *parentMatch6 = match;
103 }
104 else
105 {
106 lexer.ThrowExpectationFailure(span, U"QualifiedId");
107 }
108 }
109 *parentMatch5 = match;
110 }
111 *parentMatch4 = match;
112 }
113 *parentMatch3 = match;
114 }
115 if (match.hit)
116 {
117 soulng::parser::Match match(false);
118 soulng::parser::Match* parentMatch7 = &match;
119 {
120 soulng::parser::Match match(false);
121 soulng::parser::Match* parentMatch8 = &match;
122 {
123 int64_t pos = lexer.GetPos();
124 soulng::parser::Match match(true);
125 soulng::parser::Match* parentMatch9 = &match;
126 {
127 soulng::lexer::Span span = lexer.GetSpan();
128 soulng::parser::Match match(false);
129 if (*lexer == SEMICOLON)
130 {
131 ++lexer;
132 match.hit = true;
133 }
134 if (match.hit)
135 {
136 *parentMatch9 = match;
137 }
138 else
139 {
140 lexer.ThrowExpectationFailure(span, ToUtf32(GetTokenInfo(SEMICOLON)));
141 }
142 }
143 if (match.hit)
144 {
145 solution.reset(new sngcm::ast::Solution(name->value, lexer.FileName()));
146 }
147 *parentMatch8 = match;
148 }
149 *parentMatch7 = match;
150 }
151 *parentMatch3 = match;
152 }
153 *parentMatch2 = match;
154 }
155 if (match.hit)
156 {
157 soulng::parser::Match match(false);
158 soulng::parser::Match* parentMatch10 = &match;
159 {
160 soulng::parser::Match match(true);
161 soulng::parser::Match* parentMatch11 = &match;
162 {
163 while (true)
164 {
165 int64_t save = lexer.GetPos();
166 {
167 soulng::parser::Match match(false);
168 soulng::parser::Match* parentMatch12 = &match;
169 {
170 soulng::parser::Match match(false);
171 soulng::parser::Match* parentMatch13 = &match;
172 {
173 int64_t pos = lexer.GetPos();
174 soulng::parser::Match match = SolutionFileParser::Declaration(lexer);
175 declaration.reset(static_cast<sngcm::ast::SolutionDeclaration*>(match.value));
176 if (match.hit)
177 {
178 solution->AddDeclaration(declaration.release());
179 }
180 *parentMatch13 = match;
181 }
182 *parentMatch12 = match;
183 }
184 if (match.hit)
185 {
186 *parentMatch11 = match;
187 }
188 else
189 {
190 lexer.SetPos(save);
191 break;
192 }
193 }
194 }
195 }
196 *parentMatch10 = match;
197 }
198 *parentMatch2 = match;
199 }
200 *parentMatch1 = match;
201 }
202 if (match.hit)
203 {
204 {
205 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
206
207 #endif // SOULNG_PARSER_DEBUG_SUPPORT
208 return soulng::parser::Match(true, solution.release());
209 }
210 }
211 *parentMatch0 = match;
212 }
213 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
214
215
216
217
218
219 #endif // SOULNG_PARSER_DEBUG_SUPPORT
220 if (!match.hit)
221 {
222 match.value = nullptr;
223 }
224 return match;
225 }
226
227 soulng::parser::Match SolutionFileParser::QualifiedId(ContainerFileLexer& lexer)
228 {
229 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
230
231
232
233
234
235
236
237 #endif // SOULNG_PARSER_DEBUG_SUPPORT
238 Span s = Span();
239 soulng::parser::Match match(false);
240 soulng::parser::Match* parentMatch0 = &match;
241 {
242 int64_t pos = lexer.GetPos();
243 soulng::parser::Match match(false);
244 soulng::parser::Match* parentMatch1 = &match;
245 {
246 soulng::parser::Match match(false);
247 soulng::parser::Match* parentMatch2 = &match;
248 {
249 soulng::parser::Match match(false);
250 soulng::parser::Match* parentMatch3 = &match;
251 {
252 int64_t pos = lexer.GetPos();
253 soulng::lexer::Span span = lexer.GetSpan();
254 soulng::parser::Match match(false);
255 if (*lexer == ID)
256 {
257 ++lexer;
258 match.hit = true;
259 }
260 if (match.hit)
261 {
262 s = span;
263 }
264 *parentMatch3 = match;
265 }
266 *parentMatch2 = match;
267 }
268 if (match.hit)
269 {
270 soulng::parser::Match match(false);
271 soulng::parser::Match* parentMatch4 = &match;
272 {
273 soulng::parser::Match match(true);
274 soulng::parser::Match* parentMatch5 = &match;
275 {
276 while (true)
277 {
278 int64_t save = lexer.GetPos();
279 {
280 soulng::parser::Match match(false);
281 soulng::parser::Match* parentMatch6 = &match;
282 {
283 soulng::parser::Match match(false);
284 soulng::parser::Match* parentMatch7 = &match;
285 {
286 soulng::parser::Match match(false);
287 if (*lexer == DOT)
288 {
289 ++lexer;
290 match.hit = true;
291 }
292 *parentMatch7 = match;
293 }
294 if (match.hit)
295 {
296 soulng::parser::Match match(false);
297 soulng::parser::Match* parentMatch8 = &match;
298 {
299 soulng::parser::Match match(false);
300 soulng::parser::Match* parentMatch9 = &match;
301 {
302 int64_t pos = lexer.GetPos();
303 soulng::lexer::Span span = lexer.GetSpan();
304 soulng::parser::Match match(false);
305 if (*lexer == ID)
306 {
307 ++lexer;
308 match.hit = true;
309 }
310 if (match.hit)
311 {
312 s.end = span.end;
313 }
314 *parentMatch9 = match;
315 }
316 *parentMatch8 = match;
317 }
318 *parentMatch7 = match;
319 }
320 *parentMatch6 = match;
321 }
322 if (match.hit)
323 {
324 *parentMatch5 = match;
325 }
326 else
327 {
328 lexer.SetPos(save);
329 break;
330 }
331 }
332 }
333 }
334 *parentMatch4 = match;
335 }
336 *parentMatch2 = match;
337 }
338 *parentMatch1 = match;
339 }
340 if (match.hit)
341 {
342 {
343 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
344
345 #endif // SOULNG_PARSER_DEBUG_SUPPORT
346 return soulng::parser::Match(true, new soulng::parser::Value<std::u32string>(lexer.GetMatch(s)));
347 }
348 }
349 *parentMatch0 = match;
350 }
351 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
352
353
354
355
356
357 #endif // SOULNG_PARSER_DEBUG_SUPPORT
358 if (!match.hit)
359 {
360 match.value = nullptr;
361 }
362 return match;
363 }
364
365 soulng::parser::Match SolutionFileParser::Declaration(ContainerFileLexer& lexer)
366 {
367 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
368
369
370
371
372
373
374
375 #endif // SOULNG_PARSER_DEBUG_SUPPORT
376 std::unique_ptr<sngcm::ast::SolutionDeclaration> solutionProjectDeclaration;
377 std::unique_ptr<sngcm::ast::SolutionDeclaration> activeProjectDeclaration;
378 soulng::parser::Match match(false);
379 soulng::parser::Match* parentMatch0 = &match;
380 {
381 int64_t save = lexer.GetPos();
382 soulng::parser::Match match(false);
383 soulng::parser::Match* parentMatch1 = &match;
384 {
385 int64_t pos = lexer.GetPos();
386 soulng::parser::Match match = SolutionFileParser::SolutionProjectDeclaration(lexer);
387 solutionProjectDeclaration.reset(static_cast<sngcm::ast::SolutionDeclaration*>(match.value));
388 if (match.hit)
389 {
390 {
391 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
392
393 #endif // SOULNG_PARSER_DEBUG_SUPPORT
394 return soulng::parser::Match(true, solutionProjectDeclaration.release());
395 }
396 }
397 *parentMatch1 = match;
398 }
399 *parentMatch0 = match;
400 if (!match.hit)
401 {
402 soulng::parser::Match match(false);
403 soulng::parser::Match* parentMatch2 = &match;
404 lexer.SetPos(save);
405 {
406 soulng::parser::Match match(false);
407 soulng::parser::Match* parentMatch3 = &match;
408 {
409 int64_t pos = lexer.GetPos();
410 soulng::parser::Match match = SolutionFileParser::ActiveProjectDeclaration(lexer);
411 activeProjectDeclaration.reset(static_cast<sngcm::ast::SolutionDeclaration*>(match.value));
412 if (match.hit)
413 {
414 {
415 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
416
417 #endif // SOULNG_PARSER_DEBUG_SUPPORT
418 return soulng::parser::Match(true, activeProjectDeclaration.release());
419 }
420 }
421 *parentMatch3 = match;
422 }
423 *parentMatch2 = match;
424 }
425 *parentMatch0 = match;
426 }
427 }
428 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
429
430
431
432
433
434 #endif // SOULNG_PARSER_DEBUG_SUPPORT
435 if (!match.hit)
436 {
437 match.value = nullptr;
438 }
439 return match;
440 }
441
442 soulng::parser::Match SolutionFileParser::SolutionProjectDeclaration(ContainerFileLexer& lexer)
443 {
444 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
445
446
447
448
449
450
451
452 #endif // SOULNG_PARSER_DEBUG_SUPPORT
453 std::string filePath = std::string();
454 soulng::parser::Match match(false);
455 soulng::parser::Match* parentMatch0 = &match;
456 {
457 int64_t pos = lexer.GetPos();
458 soulng::parser::Match match(false);
459 soulng::parser::Match* parentMatch1 = &match;
460 {
461 soulng::parser::Match match(false);
462 soulng::parser::Match* parentMatch2 = &match;
463 {
464 soulng::parser::Match match(false);
465 soulng::parser::Match* parentMatch3 = &match;
466 {
467 soulng::parser::Match match(false);
468 if (*lexer == PROJECT)
469 {
470 ++lexer;
471 match.hit = true;
472 }
473 *parentMatch3 = match;
474 }
475 if (match.hit)
476 {
477 soulng::parser::Match match(false);
478 soulng::parser::Match* parentMatch4 = &match;
479 {
480 soulng::parser::Match match(false);
481 soulng::parser::Match* parentMatch5 = &match;
482 {
483 int64_t pos = lexer.GetPos();
484 soulng::parser::Match match(false);
485 if (*lexer == FILEPATH)
486 {
487 ++lexer;
488 match.hit = true;
489 }
490 if (match.hit)
491 {
492 filePath = lexer.filePath;
493 }
494 *parentMatch5 = match;
495 }
496 *parentMatch4 = match;
497 }
498 *parentMatch3 = match;
499 }
500 *parentMatch2 = match;
501 }
502 if (match.hit)
503 {
504 soulng::parser::Match match(false);
505 soulng::parser::Match* parentMatch6 = &match;
506 {
507 soulng::parser::Match match(false);
508 if (*lexer == SEMICOLON)
509 {
510 ++lexer;
511 match.hit = true;
512 }
513 *parentMatch6 = match;
514 }
515 *parentMatch2 = match;
516 }
517 *parentMatch1 = match;
518 }
519 if (match.hit)
520 {
521 {
522 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
523
524 #endif // SOULNG_PARSER_DEBUG_SUPPORT
525 return soulng::parser::Match(true, new sngcm::ast::SolutionProjectDeclaration(filePath));
526 }
527 }
528 *parentMatch0 = match;
529 }
530 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
531
532
533
534
535
536 #endif // SOULNG_PARSER_DEBUG_SUPPORT
537 if (!match.hit)
538 {
539 match.value = nullptr;
540 }
541 return match;
542 }
543
544 soulng::parser::Match SolutionFileParser::ActiveProjectDeclaration(ContainerFileLexer& lexer)
545 {
546 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
547
548
549
550
551
552
553
554 #endif // SOULNG_PARSER_DEBUG_SUPPORT
555 std::unique_ptr<soulng::parser::soulng::parser::Value<std::u32string>>activeProjectName;
556 soulng::parser::Match match(false);
557 soulng::parser::Match* parentMatch0 = &match;
558 {
559 int64_t pos = lexer.GetPos();
560 soulng::parser::Match match(false);
561 soulng::parser::Match* parentMatch1 = &match;
562 {
563 soulng::parser::Match match(false);
564 soulng::parser::Match* parentMatch2 = &match;
565 {
566 soulng::parser::Match match(false);
567 soulng::parser::Match* parentMatch3 = &match;
568 {
569 soulng::parser::Match match(false);
570 if (*lexer == ACTIVEPROJECT)
571 {
572 ++lexer;
573 match.hit = true;
574 }
575 *parentMatch3 = match;
576 }
577 if (match.hit)
578 {
579 soulng::parser::Match match(false);
580 soulng::parser::Match* parentMatch4 = &match;
581 {
582 soulng::parser::Match match = SolutionFileParser::QualifiedId(lexer);
583 activeProjectName.reset(static_cast<soulng::parser::soulng::parser::Value<std::u32string>*>(match.value));
584 *parentMatch4 = match;
585 }
586 *parentMatch3 = match;
587 }
588 *parentMatch2 = match;
589 }
590 if (match.hit)
591 {
592 soulng::parser::Match match(false);
593 soulng::parser::Match* parentMatch5 = &match;
594 {
595 soulng::parser::Match match(false);
596 if (*lexer == SEMICOLON)
597 {
598 ++lexer;
599 match.hit = true;
600 }
601 *parentMatch5 = match;
602 }
603 *parentMatch2 = match;
604 }
605 *parentMatch1 = match;
606 }
607 if (match.hit)
608 {
609 {
610 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
611
612 #endif // SOULNG_PARSER_DEBUG_SUPPORT
613 return soulng::parser::Match(true, new sngcm::ast::SolutionActiveProjectDeclaration(activeProjectName->value));
614 }
615 }
616 *parentMatch0 = match;
617 }
618 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
619
620
621
622
623
624 #endif // SOULNG_PARSER_DEBUG_SUPPORT
625 if (!match.hit)
626 {
627 match.value = nullptr;
628 }
629 return match;
630 }