code: func (t *tree) parsePlural(tok item) ast.Node {
  	const ctx = "plural"
  	if !t.inmsg {
  		t.unexpected(tok, "not in msg")
  	}
  
  	// plural and switch nodes have the same structure.
  	// BUG: the location quoted the erorr messages will not be correct.
  	var sw = t.parseSwitch(tok, itemPluralEnd).(*ast.SwitchNode)
  	var defaultNode ast.ParentNode
  	var cases []*ast.MsgPluralCaseNode
  	for _, node := range sw.Cases {
  		if len(node.Values) == 0 {
  			defaultNode = node.Body.(ast.ParentNode)
  		} else {
  			var intNode, ok = node.Values[0].(*ast.IntNode)
  			if !ok || len(node.Values) > 1 {
  				t.errorf("plural case must be a single integer, got %v", node.Values)
  			}
  			cases = append(cases, &ast.MsgPluralCaseNode{node.Pos, int(intNode.Value), node.Body.(ast.ParentNode)})
  		}
  	}
  	if defaultNode == nil {
  		t.errorf("{default} case required")
  	}
  	return &ast.MsgPluralNode{sw.Pos, "", sw.Value, cases, defaultNode}
  }
docs: // "plural" has just been read