title: Why does PowerShell parse `$true -or $false` as `CommandElement`s?
body: <p>In PowerShell, look at how statements with logical operators parsed:</p>
  
  <pre>
  > $ast = [System.Management.Automation.Language.Parser]::ParseInput( "($true) -and ($false)", [ref]$null, [ref]$null)
  > $ast.EndBlock.Statements[0].PipelineElements[0].GetType().Name
  CommandExpressionAst
  > $ast.EndBlock.Statements[0].PipelineElements[0].Expression
  
  
  Operator      : And
  Left          : (True)
  Right         : (False)
  ErrorPosition : -and
  StaticType    : System.Boolean
  Extent        : (True) -and (False)
  Parent        : (True) -and (False)
  </pre>
  
  <p>As expected, the AST sees this as a binary expression. However, if you remove the parentheses, it parses as a command. </p>
  
  <pre>
  > $true -or $false
  True
  
  > $ast = [System.Management.Automation.Language.Parser]::ParseInput( "$true -or $false", [ref]$null, [ref]$null)
  > $ast.EndBlock.Statements[0].PipelineElements[0].Gettype().Name
  CommandAst
  
  > $ast.EndBlock.Statements[0].PipelineElements[0].CommandElements
  
  
  StringConstantType : BareWord
  Value              : True
  StaticType         : System.String
  Extent             : True
  Parent             : True -or False
  
  ParameterName : or
  Argument      :
  ErrorPosition : -or
  Extent        : -or
  Parent        : True -or False
  
  StringConstantType : BareWord
  Value              : False
  StaticType         : System.String
  Extent             : False
  Parent             : True -or False
  
  </pre>
  
  <p>I studied the language grammar in the official PowerShell Language Specification, and I'm not seeing it - why is this a command, not an expression?</p>