OperatorPrecedence.cpp revision 263508
1118611Snjl//===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===// 2118611Snjl// 3245582Sjkim// The LLVM Compiler Infrastructure 4118611Snjl// 5118611Snjl// This file is distributed under the University of Illinois Open Source 6118611Snjl// License. See LICENSE.TXT for details. 7316303Sjkim// 8316303Sjkim//===----------------------------------------------------------------------===// 9316303Sjkim/// 10316303Sjkim/// \file 11316303Sjkim/// \brief Defines and computes precedence levels for binary/ternary operators. 12118611Snjl/// 13118611Snjl//===----------------------------------------------------------------------===// 14316303Sjkim#include "clang/Basic/OperatorPrecedence.h" 15316303Sjkim 16316303Sjkimnamespace clang { 17316303Sjkim 18316303Sjkimprec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, 19316303Sjkim bool CPlusPlus11) { 20316303Sjkim switch (Kind) { 21316303Sjkim case tok::greater: 22316303Sjkim // C++ [temp.names]p3: 23316303Sjkim // [...] When parsing a template-argument-list, the first 24316303Sjkim // non-nested > is taken as the ending delimiter rather than a 25316303Sjkim // greater-than operator. [...] 26316303Sjkim if (GreaterThanIsOperator) 27316303Sjkim return prec::Relational; 28316303Sjkim return prec::Unknown; 29316303Sjkim 30316303Sjkim case tok::greatergreater: 31316303Sjkim // C++11 [temp.names]p3: 32316303Sjkim // 33316303Sjkim // [...] Similarly, the first non-nested >> is treated as two 34316303Sjkim // consecutive but distinct > tokens, the first of which is 35316303Sjkim // taken as the end of the template-argument-list and completes 36316303Sjkim // the template-id. [...] 37316303Sjkim if (GreaterThanIsOperator || !CPlusPlus11) 38316303Sjkim return prec::Shift; 39316303Sjkim return prec::Unknown; 40316303Sjkim 41316303Sjkim default: return prec::Unknown; 42316303Sjkim case tok::comma: return prec::Comma; 43316303Sjkim case tok::equal: 44316303Sjkim case tok::starequal: 45316303Sjkim case tok::slashequal: 46316303Sjkim case tok::percentequal: 47316303Sjkim case tok::plusequal: 48316303Sjkim case tok::minusequal: 49316303Sjkim case tok::lesslessequal: 50316303Sjkim case tok::greatergreaterequal: 51316303Sjkim case tok::ampequal: 52316303Sjkim case tok::caretequal: 53316303Sjkim case tok::pipeequal: return prec::Assignment; 54316303Sjkim case tok::question: return prec::Conditional; 55316303Sjkim case tok::pipepipe: return prec::LogicalOr; 56316303Sjkim case tok::ampamp: return prec::LogicalAnd; 57316303Sjkim case tok::pipe: return prec::InclusiveOr; 58316303Sjkim case tok::caret: return prec::ExclusiveOr; 59316303Sjkim case tok::amp: return prec::And; 60316303Sjkim case tok::exclaimequal: 61316303Sjkim case tok::equalequal: return prec::Equality; 62316303Sjkim case tok::lessequal: 63316303Sjkim case tok::less: 64316303Sjkim case tok::greaterequal: return prec::Relational; 65316303Sjkim case tok::lessless: return prec::Shift; 66316303Sjkim case tok::plus: 67316303Sjkim case tok::minus: return prec::Additive; 68316303Sjkim case tok::percent: 69316303Sjkim case tok::slash: 70316303Sjkim case tok::star: return prec::Multiplicative; 71316303Sjkim case tok::periodstar: 72316303Sjkim case tok::arrowstar: return prec::PointerToMember; 73316303Sjkim } 74316303Sjkim} 75316303Sjkim 76316303Sjkim} // namespace clang 77316303Sjkim