anchor.diff:      Token equalitySign;
       if (optional('==', token)) {
         equalitySign = token;
  -      token = parseLiteralStringOrRecoverExpression(token.next);
  -    }
  -    token = expect(')', token);
  +      token = parseLiteralStringOrRecoverExpression(token);
  +    }
  +    expect(')', token);
       token = parseLiteralStringOrRecoverExpression(token);
       listener.endConditionalUri(ifKeyword, leftParen, equalitySign);
       return token;
  
positive.code:     assert(optional('part', token));
      Token partKeyword = token;
      listener.beginPart(token);
      token = parseLiteralStringOrRecoverExpression(token.next);
      token = ensureSemicolon(token);
      listener.endPart(partKeyword, token);
      return token;
  
negative.code:     listener.beginPartOf(token);
      Token partKeyword = token;
      Token ofKeyword = token.next;
      bool hasName = ofKeyword.next.isIdentifier;
      if (hasName) {
        token = parseQualified(ofKeyword.next, IdentifierContext.partName,
                IdentifierContext.partNameContinuation)
            .next;
      } else {
        token = parseLiteralStringOrRecoverExpression(ofKeyword);
      }
      token = ensureSemicolon(token);
      listener.endPartOf(partKeyword, ofKeyword, token, hasName);
  