1 #include "Parameter.hpp"
  
    2 #include <soulng/util/Unicode.hpp>
  
    3 #include <sngcm/cmparser/TypeExpr.hpp>
  
    4 #include <sngcm/cmparser/Identifier.hpp>
  
    5 #include <sngcm/cmlexer/CmajorLexer.hpp>
  
    6 #include <sngcm/cmlexer/CmajorTokens.hpp>
  
    7 
  
    8 
  
    9 
  
   10 using namespace soulng::unicode;
  
   11 using namespace sngcm::ast;
  
   12 using namespace CmajorTokens;
  
   13 
  
   14 soulng::parser::Match ParameterParser::ParameterList(CmajorLexer& lexer, ParsingContext* ctx, sngcm::ast::Node* owner)
  
   15 {
  
   16     #ifdef SOULNG_PARSER_DEBUG_SUPPORT
  
   17 
  
   18 
  
   19 
  
   20 
  
   21 
  
   22 
  
   23 
  
   24     #endif // SOULNG_PARSER_DEBUG_SUPPORT
  
   25     std::unique_ptr<ParameterNode> param;
  
   26     soulng::parser::Match match(false);
  
   27     soulng::parser::Match* parentMatch0 = &match;
  
   28     {
  
   29         soulng::parser::Match match(false);
  
   30         soulng::parser::Match* parentMatch1 = &match;
  
   31         {
  
   32             soulng::parser::Match match(false);
  
   33             if (*lexer == LPAREN)
  
   34             {
  
   35                 ++lexer;
  
   36                 match.hit = true;
  
   37             }
  
   38             *parentMatch1 = match;
  
   39         }
  
   40         if (match.hit)
  
   41         {
  
   42             soulng::parser::Match match(false);
  
   43             soulng::parser::Match* parentMatch2 = &match;
  
   44             {
  
   45                 soulng::parser::Match match(true);
  
   46                 int64_t save = lexer.GetPos();
  
   47                 soulng::parser::Match* parentMatch3 = &match;
  
   48                 {
  
   49                     soulng::parser::Match match(false);
  
   50                     soulng::parser::Match* parentMatch4 = &match;
  
   51                     {
  
   52                         soulng::parser::Match match(false);
  
   53                         soulng::parser::Match* parentMatch5 = &match;
  
   54                         {
  
   55                             soulng::parser::Match match(false);
  
   56                             soulng::parser::Match* parentMatch6 = &match;
  
   57                             {
  
   58                                 int64_t pos = lexer.GetPos();
  
   59                                 soulng::parser::Match match = ParameterParser::Parameter(lexer, ctx);
  
   60                                 param.reset(static_cast<ParameterNode*>(match.value));
  
   61                                 if (match.hit)
  
   62                                 {
  
   63                                     owner->AddParameter(param.release());
  
   64                                 }
  
   65                                 *parentMatch6 = match;
  
   66                             }
  
   67                             *parentMatch5 = match;
  
   68                         }
  
   69                         if (match.hit)
  
   70                         {
  
   71                             soulng::parser::Match match(false);
  
   72                             soulng::parser::Match* parentMatch7 = &match;
  
   73                             {
  
   74                                 soulng::parser::Match match(true);
  
   75                                 soulng::parser::Match* parentMatch8 = &match;
  
   76                                 {
  
   77                                     while (true)
  
   78                                     {
  
   79                                         int64_t save = lexer.GetPos();
  
   80                                         {
  
   81                                             soulng::parser::Match match(false);
  
   82                                             soulng::parser::Match* parentMatch9 = &match;
  
   83                                             {
  
   84                                                 soulng::parser::Match match(false);
  
   85                                                 if (*lexer == COMMA)
  
   86                                                 {
  
   87                                                     ++lexer;
  
   88                                                     match.hit = true;
  
   89                                                 }
  
   90                                                 *parentMatch9 = match;
  
   91                                             }
  
   92                                             if (match.hit)
  
   93                                             {
  
   94                                                 soulng::parser::Match match(false);
  
   95                                                 soulng::parser::Match* parentMatch10 = &match;
  
   96                                                 {
  
   97                                                     soulng::parser::Match match(false);
  
   98                                                     soulng::parser::Match* parentMatch11 = &match;
  
   99                                                     {
  
  100                                                         int64_t pos = lexer.GetPos();
  
  101                                                         soulng::parser::Match match = ParameterParser::Parameter(lexer, ctx);
  
  102                                                         param.reset(static_cast<ParameterNode*>(match.value));
  
  103                                                         if (match.hit)
  
  104                                                         {
  
  105                                                             owner->AddParameter(param.release());
  
  106                                                         }
  
  107                                                         *parentMatch11 = match;
  
  108                                                     }
  
  109                                                     *parentMatch10 = match;
  
  110                                                 }
  
  111                                                 *parentMatch9 = match;
  
  112                                             }
  
  113                                             if (match.hit)
  
  114                                             {
  
  115                                                 *parentMatch8 = match;
  
  116                                             }
  
  117                                             else
  
  118                                             {
  
  119                                                 lexer.SetPos(save);
  
  120                                                 break;
  
  121                                             }
  
  122                                         }
  
  123                                     }
  
  124                                 }
  
  125                                 *parentMatch7 = match;
  
  126                             }
  
  127                             *parentMatch5 = match;
  
  128                         }
  
  129                         *parentMatch4 = match;
  
  130                     }
  
  131                     if (match.hit)
  
  132                     {
  
  133                         *parentMatch3 = match;
  
  134                     }
  
  135                     else
  
  136                     {
  
  137                         lexer.SetPos(save);
  
  138                     }
  
  139                 }
  
  140                 *parentMatch2 = match;
  
  141             }
  
  142             *parentMatch1 = match;
  
  143         }
  
  144         *parentMatch0 = match;
  
  145     }
  
  146     if (match.hit)
  
  147     {
  
  148         soulng::parser::Match match(false);
  
  149         soulng::parser::Match* parentMatch12 = &match;
  
  150         {
  
  151             soulng::parser::Match match(true);
  
  152             soulng::parser::Match* parentMatch13 = &match;
  
  153             {
  
  154                 soulng::lexer::Span span = lexer.GetSpan();
  
  155                 soulng::parser::Match match(false);
  
  156                 if (*lexer == RPAREN)
  
  157                 {
  
  158                     ++lexer;
  
  159                     match.hit = true;
  
  160                 }
  
  161                 if (match.hit)
  
  162                 {
  
  163                     *parentMatch13 = match;
  
  164                 }
  
  165                 else
  
  166                 {
  
  167                     lexer.ThrowExpectationFailure(span, ToUtf32(GetTokenInfo(RPAREN)));
  
  168                 }
  
  169             }
  
  170             *parentMatch12 = match;
  
  171         }
  
  172         *parentMatch0 = match;
  
  173     }
  
  174     #ifdef SOULNG_PARSER_DEBUG_SUPPORT
  
  175 
  
  176 
  
  177 
  
  178 
  
  179 
  
  180     #endif // SOULNG_PARSER_DEBUG_SUPPORT
  
  181     if (!match.hit)
  
  182     {
  
  183         match.value = nullptr;
  
  184     }
  
  185     return match;
  
  186 }
  
  187 
  
  188 soulng::parser::Match ParameterParser::Parameter(CmajorLexer& lexer, ParsingContext* ctx)
  
  189 {
  
  190     #ifdef SOULNG_PARSER_DEBUG_SUPPORT
  
  191 
  
  192 
  
  193 
  
  194 
  
  195 
  
  196 
  
  197 
  
  198     #endif // SOULNG_PARSER_DEBUG_SUPPORT
  
  199     Span s = Span();
  
  200     std::unique_ptr<sngcm::ast::Node> type;
  
  201     std::unique_ptr<IdentifierNode> id;
  
  202     soulng::parser::Match match(false);
  
  203     soulng::parser::Match* parentMatch0 = &match;
  
  204     {
  
  205         int64_t pos = lexer.GetPos();
  
  206         soulng::parser::Match match(false);
  
  207         soulng::parser::Match* parentMatch1 = &match;
  
  208         {
  
  209             soulng::parser::Match match(false);
  
  210             soulng::parser::Match* parentMatch2 = &match;
  
  211             {
  
  212                 soulng::parser::Match match(false);
  
  213                 soulng::parser::Match* parentMatch3 = &match;
  
  214                 {
  
  215                     int64_t pos = lexer.GetPos();
  
  216                     soulng::lexer::Span span = lexer.GetSpan();
  
  217                     soulng::parser::Match match = TypeExprParser::TypeExpr(lexer, ctx);
  
  218                     type.reset(static_cast<sngcm::ast::Node*>(match.value));
  
  219                     if (match.hit)
  
  220                     {
  
  221                         s = span;
  
  222                     }
  
  223                     *parentMatch3 = match;
  
  224                 }
  
  225                 *parentMatch2 = match;
  
  226             }
  
  227             if (match.hit)
  
  228             {
  
  229                 soulng::parser::Match match(false);
  
  230                 soulng::parser::Match* parentMatch4 = &match;
  
  231                 {
  
  232                     soulng::parser::Match match(true);
  
  233                     int64_t save = lexer.GetPos();
  
  234                     soulng::parser::Match* parentMatch5 = &match;
  
  235                     {
  
  236                         soulng::parser::Match match(false);
  
  237                         soulng::parser::Match* parentMatch6 = &match;
  
  238                         {
  
  239                             soulng::parser::Match match(false);
  
  240                             soulng::parser::Match* parentMatch7 = &match;
  
  241                             {
  
  242                                 int64_t pos = lexer.GetPos();
  
  243                                 soulng::lexer::Span span = lexer.GetSpan();
  
  244                                 soulng::parser::Match match = IdentifierParser::Identifier(lexer);
  
  245                                 id.reset(static_cast<IdentifierNode*>(match.value));
  
  246                                 if (match.hit)
  
  247                                 {
  
  248                                     s.end = span.end;
  
  249                                 }
  
  250                                 *parentMatch7 = match;
  
  251                             }
  
  252                             *parentMatch6 = match;
  
  253                         }
  
  254                         if (match.hit)
  
  255                         {
  
  256                             *parentMatch5 = match;
  
  257                         }
  
  258                         else
  
  259                         {
  
  260                             lexer.SetPos(save);
  
  261                         }
  
  262                     }
  
  263                     *parentMatch4 = match;
  
  264                 }
  
  265                 *parentMatch2 = match;
  
  266             }
  
  267             *parentMatch1 = match;
  
  268         }
  
  269         if (match.hit)
  
  270         {
  
  271             {
  
  272                 #ifdef SOULNG_PARSER_DEBUG_SUPPORT
  
  273 
  
  274                 #endif // SOULNG_PARSER_DEBUG_SUPPORT
  
  275                 return soulng::parser::Match(true, new ParameterNode(s, type.release(), id.release()));
  
  276             }
  
  277         }
  
  278         *parentMatch0 = match;
  
  279     }
  
  280     #ifdef SOULNG_PARSER_DEBUG_SUPPORT
  
  281 
  
  282 
  
  283 
  
  284 
  
  285 
  
  286     #endif // SOULNG_PARSER_DEBUG_SUPPORT
  
  287     if (!match.hit)
  
  288     {
  
  289         match.value = nullptr;
  
  290     }
  
  291     return match;
  
  292 }