/* GRAMMAR OF AN INITIALIZER DECLARATION initializer-declaration → initializer-head generic-parameter-clause opt parameter-clause initializer-body initializer-head → attributes opt convenience opt init initializer-body → code-block */ DeclarationPtr Parser::parseInit(const std::vector<AttributePtr>& attrs) { Token token; bool convenience = match(L"convenience"); expect(Keyword::Init, token); InitializerDefPtr ret = nodeFactory->createInitializer(token.state); ret->setAttributes(attrs); if(predicate(L"<")) { GenericParametersDefPtr params = this->parseGenericParametersDef(); ret->setGenericParametersDef(params); } ParametersPtr parameters = parseParameterClause(); CodeBlockPtr body = parseCodeBlock(); ret->setConvenience(convenience); ret->setParameters(parameters); ret->setBody(body); return ret; }