brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · c4e8fe9 Raw
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