function getPrecedence (_node, parenthesis, implicit, parent) {
  let node = _node
  if (parenthesis !== 'keep') {
    // ParenthesisNodes are only ignored when not in 'keep' mode
    node = _node.getContent()
  }
  const identifier = node.getIdentifier()
  let precedence = null
  for (let i = 0; i < properties.length; i++) {
    if (identifier in properties[i]) {
      precedence = i
      break
    }
  }
  // Bump up precedence of implicit multiplication, except when preceded
  // by a "Rule 2" fraction ( [unaryOp]constant / constant )
  if (identifier === 'OperatorNode:multiply' && node.implicit &&
      implicit !== 'show') {
    const leftArg = unwrapParen(node.args[0], parenthesis)
    if (!(isConstantNode(leftArg) && parent &&
          parent.getIdentifier() === 'OperatorNode:divide' &&
          rule2Node(unwrapParen(parent.args[0], parenthesis))) &&
        !(leftArg.getIdentifier() === 'OperatorNode:divide' &&
          rule2Node(unwrapParen(leftArg.args[0], parenthesis)) &&
          isConstantNode(unwrapParen(leftArg.args[1])))
    ) {
      precedence += 1
    }
  }
  return precedence
}
Get the precedence of a Node.
Higher number for higher precedence, starting with 0.
Returns null if the precedence is undefined.

@param {Node} _node
@param {string} parenthesis
@param {string} implicit
@param {Node} parent (for determining context for implicit multiplication)
@return {number | null}