1 using System;
  2 using System.Collections;
  3 using System.Lex;
  4 using System.Parsing;
  5 using Cm.Ast;
  6 using ParserFileTokens;
  7 
  8 // this file has been automatically generated from 'C:/work/cmajorm/cmajor/projects/tools/soulcm/scmpg/build/Template.parser' using soulcm parser generator scmpg version 5.0.0
  9 
 10 public static class TemplateParser
 11 {
 12     public static Match TemplateId(ParserFileLexer& lexerParsingContext* ctx)
 13     {
 14         #if (DEBUG)
 15             Span debugSpan;
 16             bool writeToLog = lexer.Log() != null;
 17             if (writeToLog)
 18             {
 19                 debugSpan = lexer.GetSpan();
 20                 System.Lex.WriteBeginRuleToLog(lexeru"TemplateId");
 21             }
 22         #endif
 23         UniquePtr<TemplateIdNode> templateId;
 24         Span e;
 25         UniquePtr<IdentifierNode> primary;
 26         UniquePtr<Node> templateArg;
 27         Match match(false);
 28         Match* parentMatch0 = &match;
 29         {
 30             Match match(false);
 31             Match* parentMatch1 = &match;
 32             {
 33                 long pos = lexer.GetPos();
 34                 Match match(true);
 35                 if (match.hit)
 36                 {
 37                     ctx->BeginParsingTemplateId();
 38                 }
 39                 *parentMatch1 = match;
 40             }
 41             *parentMatch0 = match;
 42         }
 43         if (match.hit)
 44         {
 45             Match match(false);
 46             Match* parentMatch2 = &match;
 47             {
 48                 Match match(false);
 49                 Match* parentMatch3 = &match;
 50                 {
 51                     long pos = lexer.GetPos();
 52                     Match match(false);
 53                     Match* parentMatch4 = &match;
 54                     {
 55                         Match match(false);
 56                         Match* parentMatch5 = &match;
 57                         {
 58                             Match match(false);
 59                             Match* parentMatch6 = &match;
 60                             {
 61                                 Match match(false);
 62                                 Match* parentMatch7 = &match;
 63                                 {
 64                                     long pos = lexer.GetPos();
 65                                     Span span = lexer.GetSpan();
 66                                     Match match = IdentifierParser.QualifiedId(lexerctx);
 67                                     primary.Reset(cast<IdentifierNode*>(match.value));
 68                                     if (match.hit)
 69                                     {
 70                                         templateId.Reset(new TemplateIdNode(spanctx->ModuleId()primary.Release()));
 71                                     }
 72                                     *parentMatch7 = match;
 73                                 }
 74                                 *parentMatch6 = match;
 75                             }
 76                             if (match.hit)
 77                             {
 78                                 Match match(false);
 79                                 Match* parentMatch8 = &match;
 80                                 {
 81                                     Match match(false);
 82                                     Match* parentMatch9 = &match;
 83                                     {
 84                                         long pos = lexer.GetPos();
 85                                         Match match(false);
 86                                         if (*lexer == LANGLE)
 87                                         {
 88                                             ++lexer;
 89                                             match.hit = true;
 90                                         }
 91                                         if (match.hit)
 92                                         {
 93                                             ++lexer.leftAngleCount;
 94                                         }
 95                                         *parentMatch9 = match;
 96                                     }
 97                                     *parentMatch8 = match;
 98                                 }
 99                                 *parentMatch6 = match;
100                             }
101                             *parentMatch5 = match;
102                         }
103                         if (match.hit)
104                         {
105                             Match match(false);
106                             Match* parentMatch10 = &match;
107                             {
108                                 Match match(false);
109                                 Match* parentMatch11 = &match;
110                                 {
111                                     long pos = lexer.GetPos();
112                                     Match match(false);
113                                     Match* parentMatch12 = &match;
114                                     {
115                                         Match match(false);
116                                         Match* parentMatch13 = &match;
117                                         {
118                                             Match match(false);
119                                             Match* parentMatch14 = &match;
120                                             {
121                                                 Match match(false);
122                                                 Match* parentMatch15 = &match;
123                                                 {
124                                                     Match match(false);
125                                                     Match* parentMatch16 = &match;
126                                                     {
127                                                         long pos = lexer.GetPos();
128                                                         Match match = TypeExprParser.TypeExpr(lexerctx);
129                                                         templateArg.Reset(cast<Node*>(match.value));
130                                                         if (match.hit)
131                                                         {
132                                                             templateId->AddTemplateArgument(templateArg.Release());
133                                                         }
134                                                         *parentMatch16 = match;
135                                                     }
136                                                     *parentMatch15 = match;
137                                                 }
138                                                 if (match.hit)
139                                                 {
140                                                     Match match(false);
141                                                     Match* parentMatch17 = &match;
142                                                     {
143                                                         Match match(true);
144                                                         Match* parentMatch18 = &match;
145                                                         {
146                                                             while (true)
147                                                             {
148                                                                 long save = lexer.GetPos();
149                                                                 {
150                                                                     Match match(false);
151                                                                     Match* parentMatch19 = &match;
152                                                                     {
153                                                                         Match match(false);
154                                                                         if (*lexer == COMMA)
155                                                                         {
156                                                                             ++lexer;
157                                                                             match.hit = true;
158                                                                         }
159                                                                         *parentMatch19 = match;
160                                                                     }
161                                                                     if (match.hit)
162                                                                     {
163                                                                         Match match(false);
164                                                                         Match* parentMatch20 = &match;
165                                                                         {
166                                                                             Match match(false);
167                                                                             Match* parentMatch21 = &match;
168                                                                             {
169                                                                                 long pos = lexer.GetPos();
170                                                                                 Match match = TypeExprParser.TypeExpr(lexerctx);
171                                                                                 templateArg.Reset(cast<Node*>(match.value));
172                                                                                 if (match.hit)
173                                                                                 {
174                                                                                     templateId->AddTemplateArgument(templateArg.Release());
175                                                                                 }
176                                                                                 *parentMatch21 = match;
177                                                                             }
178                                                                             *parentMatch20 = match;
179                                                                         }
180                                                                         *parentMatch19 = match;
181                                                                     }
182                                                                     if (match.hit)
183                                                                     {
184                                                                         *parentMatch18 = match;
185                                                                     }
186                                                                     else
187                                                                     {
188                                                                         lexer.SetPos(save);
189                                                                         break;
190                                                                     }
191                                                                 }
192                                                             }
193                                                         }
194                                                         *parentMatch17 = match;
195                                                     }
196                                                     *parentMatch15 = match;
197                                                 }
198                                                 *parentMatch14 = match;
199                                             }
200                                             *parentMatch13 = match;
201                                         }
202                                         if (match.hit)
203                                         {
204                                             Match match(false);
205                                             Match* parentMatch22 = &match;
206                                             {
207                                                 Match match(false);
208                                                 Match* parentMatch23 = &match;
209                                                 {
210                                                     long pos = lexer.GetPos();
211                                                     Span span = lexer.GetSpan();
212                                                     Match match(false);
213                                                     if (*lexer == RANGLE)
214                                                     {
215                                                         ++lexer;
216                                                         match.hit = true;
217                                                     }
218                                                     if (match.hit)
219                                                     {
220                                                         e = span;
221                                                     }
222                                                     *parentMatch23 = match;
223                                                 }
224                                                 *parentMatch22 = match;
225                                             }
226                                             *parentMatch13 = match;
227                                         }
228                                         *parentMatch12 = match;
229                                     }
230                                     if (match.hit)
231                                     {
232                                         --lexer.leftAngleCount;
233                                     }
234                                     else
235                                     {
236                                         --lexer.leftAngleCount;
237                                     }
238                                     *parentMatch11 = match;
239                                 }
240                                 *parentMatch10 = match;
241                             }
242                             *parentMatch5 = match;
243                         }
244                         *parentMatch4 = match;
245                     }
246                     if (match.hit)
247                     {
248                         templateId->SetSpanEnd(e.end);
249                         ctx->EndParsingTemplateId();
250                         {
251                             #if (DEBUG)
252                                 if (writeToLog) System.Lex.WriteSuccessToLog(lexerdebugSpanu"TemplateId");
253                             #endif
254                             return Match(truetemplateId.Release());
255                         }
256                     }
257                     else
258                     {
259                         ctx->EndParsingTemplateId();
260                     }
261                     *parentMatch3 = match;
262                 }
263                 *parentMatch2 = match;
264             }
265             *parentMatch0 = match;
266         }
267         #if (DEBUG)
268             if (writeToLog)
269             {
270                 if (match.hit)
271                 {
272                     System.Lex.WriteSuccessToLog(lexerdebugSpanu"TemplateId");
273                 }
274                 else
275                 {
276                     System.Lex.WriteFailureToLog(lexeru"TemplateId");
277                 }
278             }
279         #endif
280         if (!match.hit)
281         {
282             match.value = null;
283         }
284         return match;
285     }
286     public static Match TemplateParameter(ParserFileLexer& lexerParsingContext* ctx)
287     {
288         #if (DEBUG)
289             Span debugSpan;
290             bool writeToLog = lexer.Log() != null;
291             if (writeToLog)
292             {
293                 debugSpan = lexer.GetSpan();
294                 System.Lex.WriteBeginRuleToLog(lexeru"TemplateParameter");
295             }
296         #endif
297         UniquePtr<IdentifierNode> id;
298         UniquePtr<Node> type;
299         Match match(false);
300         Match* parentMatch0 = &match;
301         {
302             long pos = lexer.GetPos();
303             Span span = lexer.GetSpan();
304             Match match(false);
305             Match* parentMatch1 = &match;
306             {
307                 Match match(false);
308                 Match* parentMatch2 = &match;
309                 {
310                     Match match = IdentifierParser.Identifier(lexerctx);
311                     id.Reset(cast<IdentifierNode*>(match.value));
312                     *parentMatch2 = match;
313                 }
314                 if (match.hit)
315                 {
316                     Match match(false);
317                     Match* parentMatch3 = &match;
318                     {
319                         Match match(true);
320                         long save = lexer.GetPos();
321                         Match* parentMatch4 = &match;
322                         {
323                             Match match(false);
324                             Match* parentMatch5 = &match;
325                             {
326                                 Match match(false);
327                                 Match* parentMatch6 = &match;
328                                 {
329                                     Match match(false);
330                                     if (*lexer == ASSIGN)
331                                     {
332                                         ++lexer;
333                                         match.hit = true;
334                                     }
335                                     *parentMatch6 = match;
336                                 }
337                                 if (match.hit)
338                                 {
339                                     Match match(false);
340                                     Match* parentMatch7 = &match;
341                                     {
342                                         Match match = TypeExprParser.TypeExpr(lexerctx);
343                                         type.Reset(cast<Node*>(match.value));
344                                         *parentMatch7 = match;
345                                     }
346                                     *parentMatch6 = match;
347                                 }
348                                 *parentMatch5 = match;
349                             }
350                             if (match.hit)
351                             {
352                                 *parentMatch4 = match;
353                             }
354                             else
355                             {
356                                 lexer.SetPos(save);
357                             }
358                         }
359                         *parentMatch3 = match;
360                     }
361                     *parentMatch2 = match;
362                 }
363                 *parentMatch1 = match;
364             }
365             if (match.hit)
366             {
367                 {
368                     #if (DEBUG)
369                         if (writeToLog) System.Lex.WriteSuccessToLog(lexerdebugSpanu"TemplateParameter");
370                     #endif
371                     return Match(truenew TemplateParameterNode(spanctx->ModuleId()id.Release()type.Release()));
372                 }
373             }
374             *parentMatch0 = match;
375         }
376         #if (DEBUG)
377             if (writeToLog)
378             {
379                 if (match.hit)
380                 {
381                     System.Lex.WriteSuccessToLog(lexerdebugSpanu"TemplateParameter");
382                 }
383                 else
384                 {
385                     System.Lex.WriteFailureToLog(lexeru"TemplateParameter");
386                 }
387             }
388         #endif
389         if (!match.hit)
390         {
391             match.value = null;
392         }
393         return match;
394     }
395     public static Match TemplateParameterList(ParserFileLexer& lexerParsingContext* ctxNode* owner)
396     {
397         #if (DEBUG)
398             Span debugSpan;
399             bool writeToLog = lexer.Log() != null;
400             if (writeToLog)
401             {
402                 debugSpan = lexer.GetSpan();
403                 System.Lex.WriteBeginRuleToLog(lexeru"TemplateParameterList");
404             }
405         #endif
406         UniquePtr<TemplateParameterNode> tp;
407         Match match(false);
408         Match* parentMatch0 = &match;
409         {
410             Match match(false);
411             Match* parentMatch1 = &match;
412             {
413                 Match match(false);
414                 if (*lexer == LANGLE)
415                 {
416                     ++lexer;
417                     match.hit = true;
418                 }
419                 *parentMatch1 = match;
420             }
421             if (match.hit)
422             {
423                 Match match(false);
424                 Match* parentMatch2 = &match;
425                 {
426                     Match match(false);
427                     Match* parentMatch3 = &match;
428                     {
429                         Match match(false);
430                         Match* parentMatch4 = &match;
431                         {
432                             Match match(false);
433                             Match* parentMatch5 = &match;
434                             {
435                                 long pos = lexer.GetPos();
436                                 Match match = TemplateParser.TemplateParameter(lexerctx);
437                                 tp.Reset(cast<TemplateParameterNode*>(match.value));
438                                 if (match.hit)
439                                 {
440                                     owner->AddTemplateParameter(tp.Release());
441                                 }
442                                 *parentMatch5 = match;
443                             }
444                             *parentMatch4 = match;
445                         }
446                         if (match.hit)
447                         {
448                             Match match(false);
449                             Match* parentMatch6 = &match;
450                             {
451                                 Match match(true);
452                                 Match* parentMatch7 = &match;
453                                 {
454                                     while (true)
455                                     {
456                                         long save = lexer.GetPos();
457                                         {
458                                             Match match(false);
459                                             Match* parentMatch8 = &match;
460                                             {
461                                                 Match match(false);
462                                                 if (*lexer == COMMA)
463                                                 {
464                                                     ++lexer;
465                                                     match.hit = true;
466                                                 }
467                                                 *parentMatch8 = match;
468                                             }
469                                             if (match.hit)
470                                             {
471                                                 Match match(false);
472                                                 Match* parentMatch9 = &match;
473                                                 {
474                                                     Match match(false);
475                                                     Match* parentMatch10 = &match;
476                                                     {
477                                                         long pos = lexer.GetPos();
478                                                         Match match = TemplateParser.TemplateParameter(lexerctx);
479                                                         tp.Reset(cast<TemplateParameterNode*>(match.value));
480                                                         if (match.hit)
481                                                         {
482                                                             owner->AddTemplateParameter(tp.Release());
483                                                         }
484                                                         *parentMatch10 = match;
485                                                     }
486                                                     *parentMatch9 = match;
487                                                 }
488                                                 *parentMatch8 = match;
489                                             }
490                                             if (match.hit)
491                                             {
492                                                 *parentMatch7 = match;
493                                             }
494                                             else
495                                             {
496                                                 lexer.SetPos(save);
497                                                 break;
498                                             }
499                                         }
500                                     }
501                                 }
502                                 *parentMatch6 = match;
503                             }
504                             *parentMatch4 = match;
505                         }
506                         *parentMatch3 = match;
507                     }
508                     *parentMatch2 = match;
509                 }
510                 *parentMatch1 = match;
511             }
512             *parentMatch0 = match;
513         }
514         if (match.hit)
515         {
516             Match match(false);
517             Match* parentMatch11 = &match;
518             {
519                 Match match(true);
520                 Match* parentMatch12 = &match;
521                 {
522                     System.Lex.Span span = lexer.GetSpan();
523                     Match match(false);
524                     if (*lexer == RANGLE)
525                     {
526                         ++lexer;
527                         match.hit = true;
528                     }
529                     if (match.hit)
530                     {
531                         *parentMatch12 = match;
532                     }
533                     else
534                     {
535                         lexer.ThrowExpectationFailure(spanGetTokenName(RANGLE));
536                     }
537                 }
538                 *parentMatch11 = match;
539             }
540             *parentMatch0 = match;
541         }
542         #if (DEBUG)
543             if (writeToLog)
544             {
545                 if (match.hit)
546                 {
547                     System.Lex.WriteSuccessToLog(lexerdebugSpanu"TemplateParameterList");
548                 }
549                 else
550                 {
551                     System.Lex.WriteFailureToLog(lexeru"TemplateParameterList");
552                 }
553             }
554         #endif
555         if (!match.hit)
556         {
557             match.value = null;
558         }
559         return match;
560     }
561 }