77 lines · cpp
1//===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// Defines and computes precedence levels for binary/ternary operators.11///12//===----------------------------------------------------------------------===//13#include "clang/Basic/OperatorPrecedence.h"14 15namespace clang {16 17prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator,18 bool CPlusPlus11) {19 switch (Kind) {20 case tok::greater:21 // C++ [temp.names]p3:22 // [...] When parsing a template-argument-list, the first23 // non-nested > is taken as the ending delimiter rather than a24 // greater-than operator. [...]25 if (GreaterThanIsOperator)26 return prec::Relational;27 return prec::Unknown;28 29 case tok::greatergreater:30 // C++11 [temp.names]p3:31 //32 // [...] Similarly, the first non-nested >> is treated as two33 // consecutive but distinct > tokens, the first of which is34 // taken as the end of the template-argument-list and completes35 // the template-id. [...]36 if (GreaterThanIsOperator || !CPlusPlus11)37 return prec::Shift;38 return prec::Unknown;39 40 default: return prec::Unknown;41 case tok::comma: return prec::Comma;42 case tok::equal:43 case tok::starequal:44 case tok::slashequal:45 case tok::percentequal:46 case tok::plusequal:47 case tok::minusequal:48 case tok::lesslessequal:49 case tok::greatergreaterequal:50 case tok::ampequal:51 case tok::caretequal:52 case tok::pipeequal: return prec::Assignment;53 case tok::question: return prec::Conditional;54 case tok::pipepipe: return prec::LogicalOr;55 case tok::ampamp: return prec::LogicalAnd;56 case tok::pipe: return prec::InclusiveOr;57 case tok::caret: return prec::ExclusiveOr;58 case tok::amp: return prec::And;59 case tok::exclaimequal:60 case tok::equalequal: return prec::Equality;61 case tok::lessequal:62 case tok::less:63 case tok::greaterequal: return prec::Relational;64 case tok::spaceship: return prec::Spaceship;65 case tok::lessless: return prec::Shift;66 case tok::plus:67 case tok::minus: return prec::Additive;68 case tok::percent:69 case tok::slash:70 case tok::star: return prec::Multiplicative;71 case tok::periodstar:72 case tok::arrowstar: return prec::PointerToMember;73 }74}75 76} // namespace clang77