xref: /freebsd/contrib/llvm-project/clang/include/clang/Basic/OperatorPrecedence.h (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
10b57cec5SDimitry Andric //===--- OperatorPrecedence.h - Operator precedence levels ------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric ///
90b57cec5SDimitry Andric /// \file
100b57cec5SDimitry Andric /// Defines and computes precedence levels for binary/ternary operators.
110b57cec5SDimitry Andric ///
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #ifndef LLVM_CLANG_BASIC_OPERATORPRECEDENCE_H
150b57cec5SDimitry Andric #define LLVM_CLANG_BASIC_OPERATORPRECEDENCE_H
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric #include "clang/Basic/TokenKinds.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric namespace clang {
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric /// PrecedenceLevels - These are precedences for the binary/ternary
220b57cec5SDimitry Andric /// operators in the C99 grammar.  These have been named to relate
230b57cec5SDimitry Andric /// with the C99 grammar productions.  Low precedences numbers bind
240b57cec5SDimitry Andric /// more weakly than high numbers.
250b57cec5SDimitry Andric namespace prec {
260b57cec5SDimitry Andric   enum Level {
270b57cec5SDimitry Andric     Unknown         = 0,    // Not binary operator.
280b57cec5SDimitry Andric     Comma           = 1,    // ,
290b57cec5SDimitry Andric     Assignment      = 2,    // =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
300b57cec5SDimitry Andric     Conditional     = 3,    // ?
310b57cec5SDimitry Andric     LogicalOr       = 4,    // ||
320b57cec5SDimitry Andric     LogicalAnd      = 5,    // &&
330b57cec5SDimitry Andric     InclusiveOr     = 6,    // |
340b57cec5SDimitry Andric     ExclusiveOr     = 7,    // ^
350b57cec5SDimitry Andric     And             = 8,    // &
360b57cec5SDimitry Andric     Equality        = 9,    // ==, !=
370b57cec5SDimitry Andric     Relational      = 10,   //  >=, <=, >, <
380b57cec5SDimitry Andric     Spaceship       = 11,   // <=>
390b57cec5SDimitry Andric     Shift           = 12,   // <<, >>
400b57cec5SDimitry Andric     Additive        = 13,   // -, +
410b57cec5SDimitry Andric     Multiplicative  = 14,   // *, /, %
420b57cec5SDimitry Andric     PointerToMember = 15    // .*, ->*
430b57cec5SDimitry Andric   };
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric /// Return the precedence of the specified binary operator token.
470b57cec5SDimitry Andric prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator,
480b57cec5SDimitry Andric                                bool CPlusPlus11);
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric }  // end namespace clang
510b57cec5SDimitry Andric 
52*04eeddc0SDimitry Andric #endif // LLVM_CLANG_BASIC_OPERATORPRECEDENCE_H
53