forked from OSchip/llvm-project
Move operator precedence calculation to new header
Thereby, it can be reused by clang-format and others. Review: http://llvm-reviews.chandlerc.com/D229 llvm-svn: 170757
This commit is contained in:
parent
2ababf68d7
commit
d1122cb50d
|
@ -0,0 +1,52 @@
|
||||||
|
//===--- OperatorPrecedence.h - Operator precedence levels ------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
///
|
||||||
|
/// \file
|
||||||
|
/// \brief Defines and computes precedence levels for binary/ternary operators.
|
||||||
|
///
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_CLANG_OPERATOR_PRECEDENCE_H
|
||||||
|
#define LLVM_CLANG_OPERATOR_PRECEDENCE_H
|
||||||
|
|
||||||
|
#include "clang/Basic/TokenKinds.h"
|
||||||
|
|
||||||
|
namespace clang {
|
||||||
|
|
||||||
|
/// PrecedenceLevels - These are precedences for the binary/ternary
|
||||||
|
/// operators in the C99 grammar. These have been named to relate
|
||||||
|
/// with the C99 grammar productions. Low precedences numbers bind
|
||||||
|
/// more weakly than high numbers.
|
||||||
|
namespace prec {
|
||||||
|
enum Level {
|
||||||
|
Unknown = 0, // Not binary operator.
|
||||||
|
Comma = 1, // ,
|
||||||
|
Assignment = 2, // =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
|
||||||
|
Conditional = 3, // ?
|
||||||
|
LogicalOr = 4, // ||
|
||||||
|
LogicalAnd = 5, // &&
|
||||||
|
InclusiveOr = 6, // |
|
||||||
|
ExclusiveOr = 7, // ^
|
||||||
|
And = 8, // &
|
||||||
|
Equality = 9, // ==, !=
|
||||||
|
Relational = 10, // >=, <=, >, <
|
||||||
|
Shift = 11, // <<, >>
|
||||||
|
Additive = 12, // -, +
|
||||||
|
Multiplicative = 13, // *, /, %
|
||||||
|
PointerToMember = 14 // .*, ->*
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \brief Return the precedence of the specified binary operator token.
|
||||||
|
prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator,
|
||||||
|
bool CPlusPlus0x);
|
||||||
|
|
||||||
|
} // end namespace clang
|
||||||
|
|
||||||
|
#endif // LLVM_CLANG_OPERATOR_PRECEDENCE_H
|
|
@ -14,6 +14,7 @@
|
||||||
#ifndef LLVM_CLANG_PARSE_PARSER_H
|
#ifndef LLVM_CLANG_PARSE_PARSER_H
|
||||||
#define LLVM_CLANG_PARSE_PARSER_H
|
#define LLVM_CLANG_PARSE_PARSER_H
|
||||||
|
|
||||||
|
#include "clang/Basic/OperatorPrecedence.h"
|
||||||
#include "clang/Basic/Specifiers.h"
|
#include "clang/Basic/Specifiers.h"
|
||||||
#include "clang/Lex/CodeCompletionHandler.h"
|
#include "clang/Lex/CodeCompletionHandler.h"
|
||||||
#include "clang/Lex/Preprocessor.h"
|
#include "clang/Lex/Preprocessor.h"
|
||||||
|
@ -44,30 +45,6 @@ namespace clang {
|
||||||
class PoisonSEHIdentifiersRAIIObject;
|
class PoisonSEHIdentifiersRAIIObject;
|
||||||
class VersionTuple;
|
class VersionTuple;
|
||||||
|
|
||||||
/// PrecedenceLevels - These are precedences for the binary/ternary
|
|
||||||
/// operators in the C99 grammar. These have been named to relate
|
|
||||||
/// with the C99 grammar productions. Low precedences numbers bind
|
|
||||||
/// more weakly than high numbers.
|
|
||||||
namespace prec {
|
|
||||||
enum Level {
|
|
||||||
Unknown = 0, // Not binary operator.
|
|
||||||
Comma = 1, // ,
|
|
||||||
Assignment = 2, // =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=
|
|
||||||
Conditional = 3, // ?
|
|
||||||
LogicalOr = 4, // ||
|
|
||||||
LogicalAnd = 5, // &&
|
|
||||||
InclusiveOr = 6, // |
|
|
||||||
ExclusiveOr = 7, // ^
|
|
||||||
And = 8, // &
|
|
||||||
Equality = 9, // ==, !=
|
|
||||||
Relational = 10, // >=, <=, >, <
|
|
||||||
Shift = 11, // <<, >>
|
|
||||||
Additive = 12, // -, +
|
|
||||||
Multiplicative = 13, // *, /, %
|
|
||||||
PointerToMember = 14 // .*, ->*
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Parser - This implements a parser for the C family of languages. After
|
/// Parser - This implements a parser for the C family of languages. After
|
||||||
/// parsing units of the grammar, productions are invoked to handle whatever has
|
/// parsing units of the grammar, productions are invoked to handle whatever has
|
||||||
/// been read.
|
/// been read.
|
||||||
|
|
|
@ -12,6 +12,7 @@ add_clang_library(clangBasic
|
||||||
LangOptions.cpp
|
LangOptions.cpp
|
||||||
Module.cpp
|
Module.cpp
|
||||||
ObjCRuntime.cpp
|
ObjCRuntime.cpp
|
||||||
|
OperatorPrecedence.cpp
|
||||||
SourceLocation.cpp
|
SourceLocation.cpp
|
||||||
SourceManager.cpp
|
SourceManager.cpp
|
||||||
TargetInfo.cpp
|
TargetInfo.cpp
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
//===--- OperatorPrecedence.cpp ---------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
///
|
||||||
|
/// \file
|
||||||
|
/// \brief Defines and computes precedence levels for binary/ternary operators.
|
||||||
|
///
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
#include "clang/Basic/OperatorPrecedence.h"
|
||||||
|
|
||||||
|
namespace clang {
|
||||||
|
|
||||||
|
prec::Level clang::getBinOpPrecedence(
|
||||||
|
tok::TokenKind Kind, bool GreaterThanIsOperator, bool CPlusPlus0x) {
|
||||||
|
switch (Kind) {
|
||||||
|
case tok::greater:
|
||||||
|
// C++ [temp.names]p3:
|
||||||
|
// [...] When parsing a template-argument-list, the first
|
||||||
|
// non-nested > is taken as the ending delimiter rather than a
|
||||||
|
// greater-than operator. [...]
|
||||||
|
if (GreaterThanIsOperator)
|
||||||
|
return prec::Relational;
|
||||||
|
return prec::Unknown;
|
||||||
|
|
||||||
|
case tok::greatergreater:
|
||||||
|
// C++0x [temp.names]p3:
|
||||||
|
//
|
||||||
|
// [...] Similarly, the first non-nested >> is treated as two
|
||||||
|
// consecutive but distinct > tokens, the first of which is
|
||||||
|
// taken as the end of the template-argument-list and completes
|
||||||
|
// the template-id. [...]
|
||||||
|
if (GreaterThanIsOperator || !CPlusPlus0x)
|
||||||
|
return prec::Shift;
|
||||||
|
return prec::Unknown;
|
||||||
|
|
||||||
|
default: return prec::Unknown;
|
||||||
|
case tok::comma: return prec::Comma;
|
||||||
|
case tok::equal:
|
||||||
|
case tok::starequal:
|
||||||
|
case tok::slashequal:
|
||||||
|
case tok::percentequal:
|
||||||
|
case tok::plusequal:
|
||||||
|
case tok::minusequal:
|
||||||
|
case tok::lesslessequal:
|
||||||
|
case tok::greatergreaterequal:
|
||||||
|
case tok::ampequal:
|
||||||
|
case tok::caretequal:
|
||||||
|
case tok::pipeequal: return prec::Assignment;
|
||||||
|
case tok::question: return prec::Conditional;
|
||||||
|
case tok::pipepipe: return prec::LogicalOr;
|
||||||
|
case tok::ampamp: return prec::LogicalAnd;
|
||||||
|
case tok::pipe: return prec::InclusiveOr;
|
||||||
|
case tok::caret: return prec::ExclusiveOr;
|
||||||
|
case tok::amp: return prec::And;
|
||||||
|
case tok::exclaimequal:
|
||||||
|
case tok::equalequal: return prec::Equality;
|
||||||
|
case tok::lessequal:
|
||||||
|
case tok::less:
|
||||||
|
case tok::greaterequal: return prec::Relational;
|
||||||
|
case tok::lessless: return prec::Shift;
|
||||||
|
case tok::plus:
|
||||||
|
case tok::minus: return prec::Additive;
|
||||||
|
case tok::percent:
|
||||||
|
case tok::slash:
|
||||||
|
case tok::star: return prec::Multiplicative;
|
||||||
|
case tok::periodstar:
|
||||||
|
case tok::arrowstar: return prec::PointerToMember;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace clang
|
|
@ -32,67 +32,6 @@
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
using namespace clang;
|
using namespace clang;
|
||||||
|
|
||||||
/// \brief Return the precedence of the specified binary operator token.
|
|
||||||
static prec::Level getBinOpPrecedence(tok::TokenKind Kind,
|
|
||||||
bool GreaterThanIsOperator,
|
|
||||||
bool CPlusPlus0x) {
|
|
||||||
switch (Kind) {
|
|
||||||
case tok::greater:
|
|
||||||
// C++ [temp.names]p3:
|
|
||||||
// [...] When parsing a template-argument-list, the first
|
|
||||||
// non-nested > is taken as the ending delimiter rather than a
|
|
||||||
// greater-than operator. [...]
|
|
||||||
if (GreaterThanIsOperator)
|
|
||||||
return prec::Relational;
|
|
||||||
return prec::Unknown;
|
|
||||||
|
|
||||||
case tok::greatergreater:
|
|
||||||
// C++0x [temp.names]p3:
|
|
||||||
//
|
|
||||||
// [...] Similarly, the first non-nested >> is treated as two
|
|
||||||
// consecutive but distinct > tokens, the first of which is
|
|
||||||
// taken as the end of the template-argument-list and completes
|
|
||||||
// the template-id. [...]
|
|
||||||
if (GreaterThanIsOperator || !CPlusPlus0x)
|
|
||||||
return prec::Shift;
|
|
||||||
return prec::Unknown;
|
|
||||||
|
|
||||||
default: return prec::Unknown;
|
|
||||||
case tok::comma: return prec::Comma;
|
|
||||||
case tok::equal:
|
|
||||||
case tok::starequal:
|
|
||||||
case tok::slashequal:
|
|
||||||
case tok::percentequal:
|
|
||||||
case tok::plusequal:
|
|
||||||
case tok::minusequal:
|
|
||||||
case tok::lesslessequal:
|
|
||||||
case tok::greatergreaterequal:
|
|
||||||
case tok::ampequal:
|
|
||||||
case tok::caretequal:
|
|
||||||
case tok::pipeequal: return prec::Assignment;
|
|
||||||
case tok::question: return prec::Conditional;
|
|
||||||
case tok::pipepipe: return prec::LogicalOr;
|
|
||||||
case tok::ampamp: return prec::LogicalAnd;
|
|
||||||
case tok::pipe: return prec::InclusiveOr;
|
|
||||||
case tok::caret: return prec::ExclusiveOr;
|
|
||||||
case tok::amp: return prec::And;
|
|
||||||
case tok::exclaimequal:
|
|
||||||
case tok::equalequal: return prec::Equality;
|
|
||||||
case tok::lessequal:
|
|
||||||
case tok::less:
|
|
||||||
case tok::greaterequal: return prec::Relational;
|
|
||||||
case tok::lessless: return prec::Shift;
|
|
||||||
case tok::plus:
|
|
||||||
case tok::minus: return prec::Additive;
|
|
||||||
case tok::percent:
|
|
||||||
case tok::slash:
|
|
||||||
case tok::star: return prec::Multiplicative;
|
|
||||||
case tok::periodstar:
|
|
||||||
case tok::arrowstar: return prec::PointerToMember;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// \brief Simple precedence-based parser for binary/ternary operators.
|
/// \brief Simple precedence-based parser for binary/ternary operators.
|
||||||
///
|
///
|
||||||
/// Note: we diverge from the C99 grammar when parsing the assignment-expression
|
/// Note: we diverge from the C99 grammar when parsing the assignment-expression
|
||||||
|
|
Loading…
Reference in New Issue