/* getter-setter-block → {getter-clause setter-clauseopt} getter-setter-block → {setter-clause getter-clause} getter-clause → attributes opt get code-block setter-clause → attributes opt set setter-name opt code-block setter-name → (identifier) */ std::pair<CodeBlockPtr, std::pair<std::wstring, CodeBlockPtr> > Parser::parseGetterSetterBlock() { Token token; Attributes attrs; parseAttributes(attrs); peek(token); CodeBlockPtr getter = NULL; std::pair<std::wstring, CodeBlockPtr> setter = std::make_pair(std::wstring(), CodeBlockPtr()); if(token.getKeyword() == Keyword::Get) { expect_next(token); getter = parseCodeBlock(); getter->setAttributes(attrs); peek(token); if(token == L"@" || token.getKeyword() == Keyword::Set) { setter = parseSetterClause(); } } else if(token.getKeyword() == Keyword::Set) { setter = parseSetterClause(); setter.second->setAttributes(attrs); parseAttributes(attrs); expect(Keyword::Get); getter = parseCodeBlock(); getter->setAttributes(attrs); } return std::make_pair(getter, setter); }
/* getter-setter-keyword-block → {getter-keyword-clause setter-keyword-clause opt} getter-setter-keyword-block → {setter-keyword-clause getter-keyword-clause} getter-keyword-clause → attributes opt get setter-keyword-clause → attributes opt set */ std::pair<CodeBlockPtr, CodeBlockPtr> Parser::parseGetterSetterKeywordBlock() { Token token; Attributes attributes; parseAttributes(attributes); CodeBlockPtr getter = NULL; CodeBlockPtr setter = NULL; if(match(Keyword::Get, token)) { getter = nodeFactory->createCodeBlock(token.state); getter->setAttributes(attributes); parseAttributes(attributes); if(match(Keyword::Set, token)) { setter = nodeFactory->createCodeBlock(token.state); setter->setAttributes(attributes); } else if(!attributes.empty())//attributes defined for setter but setter is not found { Token token; expect_next(token); unexpected(token); } } else if(match(Keyword::Set, token)) { setter = nodeFactory->createCodeBlock(token.state); setter->setAttributes(attributes); parseAttributes(attributes); expect(Keyword::Get, token); getter = nodeFactory->createCodeBlock(token.state); getter->setAttributes(attributes); } return std::make_pair(getter, setter); }