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