1e5dd7070Spatrick //===--- OperatorPrecedence.h - Operator precedence levels ------*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick /// 9e5dd7070Spatrick /// \file 10e5dd7070Spatrick /// Defines and computes precedence levels for binary/ternary operators. 11e5dd7070Spatrick /// 12e5dd7070Spatrick //===----------------------------------------------------------------------===// 13e5dd7070Spatrick 14e5dd7070Spatrick #ifndef LLVM_CLANG_BASIC_OPERATORPRECEDENCE_H 15e5dd7070Spatrick #define LLVM_CLANG_BASIC_OPERATORPRECEDENCE_H 16e5dd7070Spatrick 17e5dd7070Spatrick #include "clang/Basic/TokenKinds.h" 18e5dd7070Spatrick 19e5dd7070Spatrick namespace clang { 20e5dd7070Spatrick 21e5dd7070Spatrick /// PrecedenceLevels - These are precedences for the binary/ternary 22e5dd7070Spatrick /// operators in the C99 grammar. These have been named to relate 23e5dd7070Spatrick /// with the C99 grammar productions. Low precedences numbers bind 24e5dd7070Spatrick /// more weakly than high numbers. 25e5dd7070Spatrick namespace prec { 26e5dd7070Spatrick enum Level { 27e5dd7070Spatrick Unknown = 0, // Not binary operator. 28e5dd7070Spatrick Comma = 1, // , 29e5dd7070Spatrick Assignment = 2, // =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= 30e5dd7070Spatrick Conditional = 3, // ? 31e5dd7070Spatrick LogicalOr = 4, // || 32e5dd7070Spatrick LogicalAnd = 5, // && 33e5dd7070Spatrick InclusiveOr = 6, // | 34e5dd7070Spatrick ExclusiveOr = 7, // ^ 35e5dd7070Spatrick And = 8, // & 36e5dd7070Spatrick Equality = 9, // ==, != 37e5dd7070Spatrick Relational = 10, // >=, <=, >, < 38e5dd7070Spatrick Spaceship = 11, // <=> 39e5dd7070Spatrick Shift = 12, // <<, >> 40e5dd7070Spatrick Additive = 13, // -, + 41e5dd7070Spatrick Multiplicative = 14, // *, /, % 42e5dd7070Spatrick PointerToMember = 15 // .*, ->* 43e5dd7070Spatrick }; 44e5dd7070Spatrick } 45e5dd7070Spatrick 46e5dd7070Spatrick /// Return the precedence of the specified binary operator token. 47e5dd7070Spatrick prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, 48e5dd7070Spatrick bool CPlusPlus11); 49e5dd7070Spatrick 50e5dd7070Spatrick } // end namespace clang 51e5dd7070Spatrick 52*12c85518Srobert #endif // LLVM_CLANG_BASIC_OPERATORPRECEDENCE_H 53