1d955e83bee3919b871616223b777bab2f04942d9zhanyong.wan#!/usr/bin/env python
2e35fdd936d133bf8a48de140a3c666897588a05shiqian#
3e35fdd936d133bf8a48de140a3c666897588a05shiqian# Copyright 2007 Neal Norwitz
4e35fdd936d133bf8a48de140a3c666897588a05shiqian# Portions Copyright 2007 Google Inc.
5e35fdd936d133bf8a48de140a3c666897588a05shiqian#
6e35fdd936d133bf8a48de140a3c666897588a05shiqian# Licensed under the Apache License, Version 2.0 (the "License");
7e35fdd936d133bf8a48de140a3c666897588a05shiqian# you may not use this file except in compliance with the License.
8e35fdd936d133bf8a48de140a3c666897588a05shiqian# You may obtain a copy of the License at
9e35fdd936d133bf8a48de140a3c666897588a05shiqian#
10e35fdd936d133bf8a48de140a3c666897588a05shiqian#      http://www.apache.org/licenses/LICENSE-2.0
11e35fdd936d133bf8a48de140a3c666897588a05shiqian#
12e35fdd936d133bf8a48de140a3c666897588a05shiqian# Unless required by applicable law or agreed to in writing, software
13e35fdd936d133bf8a48de140a3c666897588a05shiqian# distributed under the License is distributed on an "AS IS" BASIS,
14e35fdd936d133bf8a48de140a3c666897588a05shiqian# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15e35fdd936d133bf8a48de140a3c666897588a05shiqian# See the License for the specific language governing permissions and
16e35fdd936d133bf8a48de140a3c666897588a05shiqian# limitations under the License.
17e35fdd936d133bf8a48de140a3c666897588a05shiqian
18e35fdd936d133bf8a48de140a3c666897588a05shiqian"""C++ keywords and helper utilities for determining keywords."""
19e35fdd936d133bf8a48de140a3c666897588a05shiqian
20e35fdd936d133bf8a48de140a3c666897588a05shiqian__author__ = 'nnorwitz@google.com (Neal Norwitz)'
21e35fdd936d133bf8a48de140a3c666897588a05shiqian
22e35fdd936d133bf8a48de140a3c666897588a05shiqian
23e35fdd936d133bf8a48de140a3c666897588a05shiqiantry:
24e35fdd936d133bf8a48de140a3c666897588a05shiqian    # Python 3.x
25e35fdd936d133bf8a48de140a3c666897588a05shiqian    import builtins
26e35fdd936d133bf8a48de140a3c666897588a05shiqianexcept ImportError:
27e35fdd936d133bf8a48de140a3c666897588a05shiqian    # Python 2.x
28e35fdd936d133bf8a48de140a3c666897588a05shiqian    import __builtin__ as builtins
29e35fdd936d133bf8a48de140a3c666897588a05shiqian
30e35fdd936d133bf8a48de140a3c666897588a05shiqian
31e35fdd936d133bf8a48de140a3c666897588a05shiqianif not hasattr(builtins, 'set'):
32e35fdd936d133bf8a48de140a3c666897588a05shiqian    # Nominal support for Python 2.3.
33e35fdd936d133bf8a48de140a3c666897588a05shiqian    from sets import Set as set
34e35fdd936d133bf8a48de140a3c666897588a05shiqian
35e35fdd936d133bf8a48de140a3c666897588a05shiqian
36e35fdd936d133bf8a48de140a3c666897588a05shiqianTYPES = set('bool char int long short double float void wchar_t unsigned signed'.split())
37e35fdd936d133bf8a48de140a3c666897588a05shiqianTYPE_MODIFIERS = set('auto register const inline extern static virtual volatile mutable'.split())
38e35fdd936d133bf8a48de140a3c666897588a05shiqianACCESS = set('public protected private friend'.split())
39e35fdd936d133bf8a48de140a3c666897588a05shiqian
40e35fdd936d133bf8a48de140a3c666897588a05shiqianCASTS = set('static_cast const_cast dynamic_cast reinterpret_cast'.split())
41e35fdd936d133bf8a48de140a3c666897588a05shiqian
42e35fdd936d133bf8a48de140a3c666897588a05shiqianOTHERS = set('true false asm class namespace using explicit this operator sizeof'.split())
43e35fdd936d133bf8a48de140a3c666897588a05shiqianOTHER_TYPES = set('new delete typedef struct union enum typeid typename template'.split())
44e35fdd936d133bf8a48de140a3c666897588a05shiqian
45e35fdd936d133bf8a48de140a3c666897588a05shiqianCONTROL = set('case switch default if else return goto'.split())
46e35fdd936d133bf8a48de140a3c666897588a05shiqianEXCEPTION = set('try catch throw'.split())
47e35fdd936d133bf8a48de140a3c666897588a05shiqianLOOP = set('while do for break continue'.split())
48e35fdd936d133bf8a48de140a3c666897588a05shiqian
49e35fdd936d133bf8a48de140a3c666897588a05shiqianALL = TYPES | TYPE_MODIFIERS | ACCESS | CASTS | OTHERS | OTHER_TYPES | CONTROL | EXCEPTION | LOOP
50e35fdd936d133bf8a48de140a3c666897588a05shiqian
51e35fdd936d133bf8a48de140a3c666897588a05shiqian
52e35fdd936d133bf8a48de140a3c666897588a05shiqiandef IsKeyword(token):
53e35fdd936d133bf8a48de140a3c666897588a05shiqian    return token in ALL
54e35fdd936d133bf8a48de140a3c666897588a05shiqian
55e35fdd936d133bf8a48de140a3c666897588a05shiqiandef IsBuiltinType(token):
56e35fdd936d133bf8a48de140a3c666897588a05shiqian    if token in ('virtual', 'inline'):
57e35fdd936d133bf8a48de140a3c666897588a05shiqian        # These only apply to methods, they can't be types by themselves.
58e35fdd936d133bf8a48de140a3c666897588a05shiqian        return False
59e35fdd936d133bf8a48de140a3c666897588a05shiqian    return token in TYPES or token in TYPE_MODIFIERS
60