anchor.diff:          let tokensP = List.map tokenP tokens |> choice |>> ignore
           tokensP <|> (tokenP Token.SUBROUTINE .>>. leftParenP .>>. typeNameListP .>>. rightParenP |>> ignore)
       
  -    and layoutQualifierIdP =
  +    let layoutQualifierIdP =
           (identifierP |>> ignore)
           <|> (identifierP .>>. tokenP Token.EQUAL .>>. constantExpressionP |>> ignore)
           <|> (tokenP Token.SHARED |>> ignore)
       
  -    and layoutQualifierIdListP =
  +    let layoutQualifierIdListP =
           layoutQualifierIdP .>>. (many (commaP .>>. layoutQualifierIdP)) |>> ignore
       
  -    and layoutQualifierP =
  +    let layoutQualifierP =
           (tokenP Token.LAYOUT) .>>. leftParenP .>>. layoutQualifierIdListP .>>. rightParenP |>> ignore
       
  -    and interpolationQualifierP =
  +    let interpolationQualifierP =
           (tokenP Token.SMOOTH |>> ignore)
           <|> (tokenP Token.FLAT |>> ignore)
           <|> (tokenP Token.NOPERSPECTIVE |>> ignore)
       
  -    and invariantQualifierP = tokenP Token.INVARIANT |>> ignore
  -    
  -    and preciseQualifierP = tokenP Token.PRECISE |>> ignore
  -    
  -    and singleTypeQualifierP =
  +    let invariantQualifierP = tokenP Token.INVARIANT |>> ignore
  +    
  +    let preciseQualifierP = tokenP Token.PRECISE |>> ignore
  +    
  +    let precisionQualifierP =
  +        (tokenP Token.HIGHPRECISION
  +        <|> tokenP Token.MEDIUMPRECISION
  +        <|> tokenP Token.LOWPRECISION) |>> ignore
  +    
  +    let singleTypeQualifierP =
           storageQualifierP
           <|> layoutQualifierP
           <|> precisionQualifierP
  
positive.code:         <|> (doubleConstant |>> ignore)
          <|> (leftParenP .>>. expressionPRef.Parser .>>. rightParenP |>> ignore)
      
      and functionIdentifierP =
          typeSpecifierP
          <|> postfixExpressionPRef.Parser
      
      and functionCallHeaderP =
          functionIdentifierP .>>. leftParenP |>> ignore
      
      and functionCallHeaderNoParametersP =
          functionCallHeaderP .>>. tokenP Token.VOID |>>  ignore
          <|> functionCallHeaderP
          
      and functionCallHeaderWithParametersP = 
          functionCallHeaderP .>>. assignmentExpressionPRef.Parser |>> ignore
          <|> functionCallHeaderWithParametersPRef.Parser .>>. commaP .>>. assignmentExpressionPRef.Parser |>> ignore
      
      and functionCallGenericP =
          functionCallHeaderWithParametersPRef.Parser .>>. rightParenP |>> ignore
          <|> functionCallHeaderNoParametersP .>>. rightParenP |>> ignore
          
      and functionCallOrMethodP = functionCallGenericP
      
      and functionCallP = functionCallOrMethodP 
      
      and integerExpressionP = expressionPRef.Parser
      
      and postfixExpressionP =
          primaryExpressionP
          <|> (postfixExpressionPRef.Parser .>>. leftBracketP .>>. integerExpressionP .>>. rightBracketP |>> ignore)
          <|> functionCallP
  
negative.code:         satisfy pred "DOUBLECONSTANT"
      
      
      let boolConstant =
          let pred token =
              match token with
              | Token.BOOLCONSTANT _ -> true
              | _ -> false
          satisfy pred "BOOLCONSTANT"
  
      let primaryExpressionP =
          (variableIdentifierP |>> ignore)
          <|> (intConstantP |>> ignore)
          <|> (uintConstantP |>> ignore)
  