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-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | /// |
9 | /// \file |
10 | /// Defines and computes precedence levels for binary/ternary operators. |
11 | /// |
12 | //===----------------------------------------------------------------------===// |
13 | #include "clang/Basic/OperatorPrecedence.h" |
14 | |
15 | namespace clang { |
16 | |
17 | prec::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 first |
23 | // non-nested > is taken as the ending delimiter rather than a |
24 | // 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 two |
33 | // consecutive but distinct > tokens, the first of which is |
34 | // taken as the end of the template-argument-list and completes |
35 | // 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::caretcaret: |
56 | case tok::ampamp: return prec::LogicalAnd; |
57 | case tok::pipe: return prec::InclusiveOr; |
58 | case tok::caret: return prec::ExclusiveOr; |
59 | case tok::amp: return prec::And; |
60 | case tok::exclaimequal: |
61 | case tok::equalequal: return prec::Equality; |
62 | case tok::lessequal: |
63 | case tok::less: |
64 | case tok::greaterequal: return prec::Relational; |
65 | case tok::spaceship: return prec::Spaceship; |
66 | case tok::lessless: return prec::Shift; |
67 | case tok::plus: |
68 | case tok::minus: return prec::Additive; |
69 | case tok::percent: |
70 | case tok::slash: |
71 | case tok::star: return prec::Multiplicative; |
72 | case tok::periodstar: |
73 | case tok::arrowstar: return prec::PointerToMember; |
74 | } |
75 | } |
76 | |
77 | } // namespace clang |
78 |