OperatorPrecedence.cpp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. //===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. ///
  10. /// \file
  11. /// \brief Defines and computes precedence levels for binary/ternary operators.
  12. ///
  13. //===----------------------------------------------------------------------===//
  14. #include "clang/Basic/OperatorPrecedence.h"
  15. namespace clang {
  16. prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator,
  17. bool CPlusPlus0x) {
  18. switch (Kind) {
  19. case tok::greater:
  20. // C++ [temp.names]p3:
  21. // [...] When parsing a template-argument-list, the first
  22. // non-nested > is taken as the ending delimiter rather than a
  23. // greater-than operator. [...]
  24. if (GreaterThanIsOperator)
  25. return prec::Relational;
  26. return prec::Unknown;
  27. case tok::greatergreater:
  28. // C++0x [temp.names]p3:
  29. //
  30. // [...] Similarly, the first non-nested >> is treated as two
  31. // consecutive but distinct > tokens, the first of which is
  32. // taken as the end of the template-argument-list and completes
  33. // the template-id. [...]
  34. if (GreaterThanIsOperator || !CPlusPlus0x)
  35. return prec::Shift;
  36. return prec::Unknown;
  37. default: return prec::Unknown;
  38. case tok::comma: return prec::Comma;
  39. case tok::equal:
  40. case tok::starequal:
  41. case tok::slashequal:
  42. case tok::percentequal:
  43. case tok::plusequal:
  44. case tok::minusequal:
  45. case tok::lesslessequal:
  46. case tok::greatergreaterequal:
  47. case tok::ampequal:
  48. case tok::caretequal:
  49. case tok::pipeequal: return prec::Assignment;
  50. case tok::question: return prec::Conditional;
  51. case tok::pipepipe: return prec::LogicalOr;
  52. case tok::ampamp: return prec::LogicalAnd;
  53. case tok::pipe: return prec::InclusiveOr;
  54. case tok::caret: return prec::ExclusiveOr;
  55. case tok::amp: return prec::And;
  56. case tok::exclaimequal:
  57. case tok::equalequal: return prec::Equality;
  58. case tok::lessequal:
  59. case tok::less:
  60. case tok::greaterequal: return prec::Relational;
  61. case tok::lessless: return prec::Shift;
  62. case tok::plus:
  63. case tok::minus: return prec::Additive;
  64. case tok::percent:
  65. case tok::slash:
  66. case tok::star: return prec::Multiplicative;
  67. case tok::periodstar:
  68. case tok::arrowstar: return prec::PointerToMember;
  69. }
  70. }
  71. } // namespace clang