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